【问题标题】:templated method on T inside a templated class on TT : Is that possible/correctTT 上的模板化类中 T 上的模板化方法:这可能/正确吗
【发布时间】:2010-04-28 12:52:05
【问题描述】:

我有一个 MyClass 类,它以类型名 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 上模板化的类中在 TT 上模板化方法的正确方法吗?

作为奖励:这种代码背后是否存在隐藏的问题/惊喜/限制? (我想专业写起来会很有趣)

【问题讨论】:

标签: c++ class templates methods


【解决方案1】:

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

任何类型的代码都存在问题/惊喜/限制。

使用此代码最终可能遇到的主要问题是您无法将模板化函数设为虚拟,因此如果您想在类级别为您的模板化函数获得多态性,您将无法使用外部函数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多