C++ T上的模板化方法在TT上的模板化类中:这可能/正确吗

C++ T上的模板化方法在TT上的模板化类中:这可能/正确吗,c++,class,templates,methods,C++,Class,Templates,Methods,我有一个类MyClass,它是在typename T上模板化的。但在内部,我想要一个方法,它是在另一个类型TT上模板化的(与T无关) 在阅读/修改之后,我发现以下符号: template <typename T> class MyClass { public : template<typename TT> void MyMethod(const TT & param) ; } ; 模板 类MyClass { 公众: 模板 无效方法(

我有一个类MyClass,它是在typename T上模板化的。但在内部,我想要一个方法,它是在另一个类型TT上模板化的(与T无关)

在阅读/修改之后,我发现以下符号:

template <typename T>
class MyClass
{
   public :
      template<typename TT>
      void MyMethod(const TT & param) ;
} ;
模板
类MyClass
{
公众:
模板
无效方法(常数TT和参数);
} ;
出于风格上的原因(我喜欢将模板类声明放在一个头文件中,将方法定义放在另一个头文件中),我不会在类声明中定义方法。因此,我必须这样写:

template <typename T>     // this is the type of the class
template <typename TT>    // this is the type of the method
void MyClass<T>::MyMethod(const TT & param)
{
   // etc.
}
template//这是类的类型
模板//这是方法的类型
void MyClass::MyMethod(const TT¶m)
{
//等等。
}
我知道我必须“声明”该方法中使用的类型名,但不知道具体是如何声明的,而且是通过反复试验和错误发现的

<>以上代码在VisualC++ 2008上编译,但这是在T.

上的一个类中在TT上模板化的方法的正确方法吗?
作为奖励:这种代码背后是否有隐藏的问题/惊喜/限制?(我想这些专业可以写得很有趣)

这确实是你想做的正确的方法,它将对每一个象素的C++编译器起作用。我在gcc4.4和最新的clang版本上测试了它

任何类型的代码背后都有问题/惊喜/限制


使用此代码最终可能遇到的主要问题是,无法使模板函数成为虚拟函数,因此,如果希望在类级别为模板函数获取多态性,则可以使用外部函数来实现它。

我认为这样做是可以的。以std::vector实现为例。您有一个类vector,它有几个模板参数(最明显的是一个元素类型),在它里面,它的一个构造函数以与您的方法类似的方式声明。它将InputIterator作为模板参数。因此,我认为这并不是不常见的做法。

至于专门化:如果不显式专门化包含类,就不能专门化成员函数: