C++ 部分类专门化中模板方法的专门化

C++ 部分类专门化中模板方法的专门化,c++,templates,C++,Templates,有以下代码: #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 specia

有以下代码:

#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;
} 
#包括
#包括
#包括
//模板类
模板
克拉萨级{
公众:
模板
void方法(){
}
};
//部分类专门化
模板
克拉萨级
{
公众:
//模板法
模板
void方法(){
}
};
//错误发生了!
模板
模板
void Klasa::Method(){
}
int main()
{ 
克拉萨物体;
object.Method();
返回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::Method()”的模板id“Method”与任何模板声明都不匹配
我尝试对方法进行专门化

void Klasa<U, int, U>::Method<int>
void Klasa::Method

,但编译器不接受它。如何为这种方法编写专门化?

不要问我确切的引用,但根据David Vandevoord的说法,这是不可能的。其基本原理是,这本质上是函数模板的部分专门化,不存在这种情况。不允许这样做的一个原因是,如果类有进一步的专门化,那么不清楚这种专门化会发生什么:函数专门化是继承的还是不继承的


显然,说这是不可能的并没有多大帮助。我们可以做些什么呢?一种简单的方法是将实现委托给重载的私有实现,该私有实现使用指针参数来消除不同类型之间的歧义。我意识到整个要点可能是避免使用额外的参数,即使它只在内部使用。另一种可能的方法是使用完全专门化的基类:该基类的成员函数模板可以显式专门化。

我理解,对于
Klasa
的每个部分专门化,您都希望“专门化”(重载,实际上,没有函数(编辑:部分)专门化)(编辑:您,实际上,试图实现)<代码>方法()/<代码>类型>代码> x>代码>。这里是代码(),看这是否是您需要的。此外,您可能真的想考虑一些有助于消除重复的特性类(我假设方法)。对于所有的泛型
Klasa
,都是一样的,您需要为类型
X
)的特定专门化提供额外的实现。编辑:也许,我应该提到,您在尝试使用
方法()
。假设类的用户理解他需要调用
Klasa::Method()
,以获得
X
方法()的“专门化”

#包括
模板
克拉萨级
{
公众:
模板
void方法()
{
}
};
模板
类Klasa
{
公众:
模板
void方法()
{
typedef typename std::enable_如果<!std::相同::value,Z>::键入任何内容;
std::cout();
lK.方法();
返回(0);
}
程序输出:

Method< Z >
Method< Z >
Method< int >
方法
方法
方法

错误很明显——你不能在只对类进行部分专门化的情况下执行此操作。也请阅读以下内容:“重载,真的,没有函数专门化”有函数模板专门化,只是没有部分函数模板专门化。@ildjarn我想,措辞很糟糕。我的意思是“没有函数专门化”在上下文中。
Klasa::Method
是部分专门化,当然,您是绝对正确的。
Method< Z >
Method< Z >
Method< int >