2017-02-08 70 views
0

我有一个从另一个模板继承的模板,本身作为第二个模板的模板参数。继承的模板定义了一个静态函数:具有静态功能模板的模板专业化

template<class T> class A 
{ 

public: 

    static void foo(); 
}; 

template<class T> class B : public A<B> 
{ 

}; 

现在我要实现对A类专门为B静态函数,但为B不专业。但我无法弄清楚如何声明模板。我甚至不确定这是否可能。我的第一个尝试是:

template<class T> void A<B<T>>::foo() 
{ 

} 

但这给出了错误:

"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization" 

我试着像前面添加“模板<>”,但没有工作的那些不同的东西。我能够编译此:

template<> void A<B<int>>::foo() 
{ 

} 

除了这一点:

template<class T> void A<T>::foo() 
{ 

} 

这是在部分专业化的尝试?我的第一印象是没有(有没有模板与多个参数,我想专门化其中之一)。相反,我想用另一个不专门的模板专门化模板。这是可能的,如果是这样,什么是正确的语法?

+0

谢谢,我刚刚纠正。我想实现A与B的专业化的静态功能,但没有专门化B. – sweatervest

回答

0

这确实是部分专业化。你不能部分专精一种方法,你必须部分专门化整个班级。见this answer。您可以尝试在单独的帮助程序结构中实现foo,并部分专门化该结构。

这是一个使用helper结构的例子。

#include <iostream> 

template<class T> struct t_helper 
{ 
    static void foo() 
    { 
     std::cout << "Not B<T>\n"; 
    } 
}; 

template<class T> class A 
{ 

public: 
    static void foo() { 
     t_helper<T>::foo(); 
    } 
}; 

template<class T> class B {}; 

// Specialize the behavior of A<T>::foo() for all B types 
template<class T> 
struct t_helper<B<T>> 
{ 
    static void foo() 
    { 
     std::cout << "Is B<T>\n"; 
    } 
}; 

int main() 
{ 
    A<int>::foo(); // Prints "Not B<T>\n" 
    A<B<int>>::foo(); // Prints "Is B<T>\n" 
    return 0; 
} 
+0

谢谢!我最终只是部分专业化整个班级。 – sweatervest