繁体   English   中英

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

[英]Can non-templated nested classes of class templates be implemented in a C++ header?

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

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

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

即使它不是顶层模板,它仍然是模板(或模板的一部分,不知道超精确的定义),因此您需要在标头中实现它(从技术上讲,它可以在源代码中)文件,如果那是唯一使用的地方,但这可能会破坏目的)。

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

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%确保这是标准行为)...我确定某些语言律师将能够解释原因:)

等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM