1

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

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

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

4

1 回答 1

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% 确定这是标准行为)......我相信一些语言律师将能够解释为什么:)

等等。

于 2013-03-02T02:09:42.077 回答