【问题标题】:Can non-templated nested classes of class templates be implemented in a C++ header?可以在 C++ 标头中实现类模板的非模板嵌套类吗?
【发布时间】:2013-03-02 01:59:38
【问题描述】:

假设一个头文件myheader.hxx定义了一个类模板A,其中定义了一个非模板类B(不依赖于A的模板参数):

template<class T>
class A {
    class B { 
        // ...
    };
};

在这种情况下可以在myheader.hxx 中实现B,还是需要单独编写myheader.cxx 以避免在链接时重复定义?这种情况是否由不同的编译器一致处理?

【问题讨论】:

  • B 确实取决于您的示例中的模板参数T。不是直接的,但是A&lt;int&gt;::BA&lt;double&gt;::B 是不相关的类型。
  • 可能没关系,但我认为typename T 现在比class T 更受欢迎。至少“酷孩子”似乎是这样做的。
  • @StephenLin - 是的,有些人认为在这里使用typename 很酷,但class 是正确的、更短的,而且这是C++ 标准编写模板的方式。使用typename 代替class 没有充分的技术理由。
  • @PeteBecker 是的,我知道这不是技术原因,我是在开玩笑......但 class 只允许向后兼容。从一开始它就应该是一个新关键字,但 Bjarne 担心可能会造成干扰,现在使用新关键字更清楚了。
  • @StephenLin - 这不是更清楚,只是不同。正如我所说,C++ 标准在任何地方都使用class

标签: c++ templates header-files nested-class


【解决方案1】:

它仍然是一个模板(或模板的一部分,不知道超精确的定义)即使它不是顶级模板,所以你需要应该在标头(从技术上讲,如果这是唯一使用它的地方,它可以在源文件中,但这可能会违背目的)。

注意:如果您不打算在类定义中实现其成员函数,则需要如下语法:

template<typename T>
void A<T>::B::foo(...)
{
    // ...
}

另外,因为之前出现过,如果B碰巧有自己的模板参数,会是这样的:

template<typename T>
template<typename T2>
void A<T>::B<T2>::foo(...)
{
    // ...
}

不是:

template<typename T, typename T2>
void A<T>::B<T2>::foo(...)
{
    // ...
}

或者如果B 没有但B::foo 有,那将是:

template<typename T>
template<typename T2>
// void A<T>::B::foo<T2>(...) // not this apparently
void A<T>::B::foo(...)
{
    // ...
}

编辑:显然它是上面的foo 而不是foo&lt;T2&gt; 的函数,至少在 GCC 中(所以几乎 100% 确定这是标准行为)...我确定某种语言律师将能够解释原因:)

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2011-10-08
    • 2018-11-08
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多