可以在C ++标头中实现非模板化的嵌套类模板吗?

时间:2013-03-02 01:59:38

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

注意:如果您不打算使用类定义内联实现其成员函数,则需要以下语法:

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<T2>,至少对于GCC(所以几乎100%确定这是标准行为)......我确定一些语言律师能够解释原因:)