代码之家  ›  专栏  ›  技术社区  ›  paercebal

t上的templated方法在tt上的templated类中:这可能/正确吗

  •  7
  • paercebal  · 技术社区  · 16 年前

    我有一个在类型名t上模板化的类myClass。但是在内部,我想要一个在另一个类型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上模板化方法的正确方法吗?

    另一个好处是:这种代码背后是否隐藏着问题/惊喜/约束?(我想专业化写作会很有趣)

    2 回复  |  直到 16 年前
        1
  •  3
  •   raph.amiard    16 年前

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

    任何类型的代码背后都有问题/惊喜/约束。

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

        2
  •  0
  •   iwasz    16 年前

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

    推荐文章