T上模板化类中T的模板化方法:这是可能的/正确的

时间:2010-04-28 12:52:06

标签: c++ class templates methods

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

阅读/修补后,我发现了以下符号:

template <typename T>
class MyClass
{
   public :
      template<typename TT>
      void MyMethod(const TT & param) ;
} ;

由于风格原因(我喜欢在一个头文件中使用模板化类声明,另一个头文件中有方法定义),我不会在类声明中定义方法。所以,我必须把它写成:

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.
}

我知道我必须“声明”该方法中使用的类型名称,但不知道具体如何,并通过试验和错误找到。

上面的代码在Visual C ++ 2008上编译,但是:这是在T上模板化的类中使用模板化方法的正确方法吗?

作为奖励:此类代码背后是否存在隐藏的问题/意外/限制? (我想专业化写作可能很有趣)

2 个答案:

答案 0 :(得分:3)

这确实是做你想做的事情的正确方法,它将适用于每个体面的C ++编译器。我在gcc4.4和最新的clang版本上进行了测试。

任何类型的代码背后都存在问题/意外/限制。

你最终可以使用这段代码运行的主要问题是你不能将模板化的函数设置为虚拟,所以如果你想在模板级别为你的模板化函数获得多态性,你就不能用它来实现它了。外部功能。

答案 1 :(得分:0)

我认为这样做是可以的。看看std :: vector实现的例子。你有类向量,它有一些模板参数(最值得注意的是一个元素类型),在里面,它的一个构造函数以与你的方法类似的方式声明。它有InputIterator作为模板参数。所以我认为这不是那么罕见的做法。