有这段代码:
#include <iostream>
#include <string>
#include <typeinfo>
// template class
template <class U, class X, class T>
class Klasa{
public:
template <class Z>
void Method(){
}
};
// partial class specialization
template <class U>
class Klasa<U, int, U>
{
public:
// template method
template <class Z>
void Method(){
}
};
// error occurs for that!
template <class U>
template <>
void Klasa<U, int, U>::Method<int>(){
}
int main()
{
Klasa<float, int, float> object;
object.Method<float>();
return 0;
}
编译错误:
error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialized
error: template-id ‘Method<int>’ for ‘void Klasa<U, int, U>::Method()’ does not match any template declaration
我尝试为方法
做专门化void Klasa<U, int, U>::Method<int>
,但编译器不接受它。如何为这种方法编写专业化?
答案 0 :(得分:1)
我理解,对于你想要“专门化”的Klasa< U, X, T >
的每个部分特化(重载,真的,没有函数(编辑:部分)专门化(编辑:你,实际上,你试图实现))类型Method()
只需X
一次。这是代码(ideone link),看看这是否是你需要的。此外,您可能真的想要考虑一些有助于消除重复的特征类(我假设Method()
对于所有通用Klasa< U, X, T>
都是相同的,并且您需要为类型{的特定特化提供其他实现{1}})。编辑:也许,我应该提一下,尝试使用X
时会出现编译错误。假设该类用户理解他需要致电Method< int >()
以获得Klasa< U, X, T >::Method()
的{{1}}“专业化”。
X
节目输出:
Method< Z >()
答案 1 :(得分:0)
请不要问我确切的报价,但根据David Vandevoorde的说法,这是无法做到的。理由是,这基本上是函数模板的部分特化,并且没有这样的东西。不允许这样做的一个原因是,如果该类有进一步的特化,则不清楚该专业化会发生什么:是继承的函数特化还是不继承?
显然,说不能做到这一点并不是很有帮助的。可以做些什么呢?一种简单的方法是将实现委托给一个重载的私有实现,该实现需要例如一个指针参数,用于消除各种类型之间的歧义。我意识到,重点可能是避免使用额外的参数,即使它仅在内部使用。另一种可能的方法是使用完全专用的基类:可以明确专门化其成员函数模板。