相关疑难解决方法(0)

应该在C++中将类模板的显式特化的定义放在何处?

根据[temp.spec]/5:

对于给定的模板和给定的模板参数集,

  • ...

  • 在程序中最多只能定义一次显式特化(根据[basic.def.odr]),和

  • ...

类模板的显式(完整)特化的定义不能放在标题中(否则每个包含此标题的翻译单元中都有一个定义,因此整个程序中将有多个定义).

此外,作为另一个证据,[basic.def.odr]/12(下面的块引用)中列出的实体不包含类模板的完全特化.而是包含" 未指定某些模板参数的模板特化 ".

可以有多个类类型的定义,枚举类型,带外部链接的内联函数([dcl.inline]),带外部链接的内联变量([dcl.inline]),类模板,非静态函数模板, concept([temp.concept]),类模板的静态数据成员,类模板的成员函数,或未指定某些模板参数的模板特化([temp.spec],[temp.class.spec])在程序中,每个定义出现在不同的翻译单元中,并且定义满足以下要求.

但是,如果我将定义放在源文件中并将其声明保留在标题中,例如,

// "a.h"
template <typename T>
struct S {};

template <>
struct S<int>; // declaration

// "a.cpp"
#include "a.h"

template <>
struct S<int> {}; // definition

// "main.cpp"
#include "a.h"

int main()
{
    S<int> s;
}
Run Code Online (Sandbox Code Playgroud)

然后发生错误(由gcc测试),因为它S<int>是一个不完整的类型.

总之,我应该在哪里放置类模板的显式特化的定义?

c++ standards templates one-definition-rule language-lawyer

9
推荐指数
1
解决办法
971
查看次数

由于标头中的专业化初始化而避免重复的符号?

由于我试图在标题中提供的定义,我正在捕获重复的符号错误.这是Minimal,Complete和Verifiable示例中的错误.头文件和源文件如下所示.

$ clang++ main.cpp x.cpp y.cpp -o main.exe 2>&1 | c++filt
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
ld: 4 duplicate symbols for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

这是一个类似的问题,但它不涉及专门化:类模板中的静态成员初始化.这个问题有专门化,但它适用于MSVC而不是Clang:如何初始化参数化模板类的静态成员.并且这个问题表明它将它放在源(*.cpp)文件中,但我们的目标是避免使用头文件Clang 3.8和'Id<S>::id' required here, but no definition is available警告:类模板的显式特化的定义应放在C++中的哪个位置?

初始化时,GCC,ICC,MSVC,SunCC和XLC都可以.Clang和LLVM给了我麻烦.Clang和LLVM在专门化的明确实例化方面也遇到了麻烦extern,因此它拥有特殊的地狱.

我们支持C++ 03但是C++ 17,所以我们必须小心这个解决方案.天真地,我尝试将特化的初始化放在一个未命名的命名空间中,以防止符号转义转换单元,但这导致了编译错误.

在标头中初始化和专门化模板类时,我们如何避免重复的符号定义?


下面是MCVE,它是一个cat main.cpp a.h s.h s.cpp t.h …

c++ templates initialization static-members template-specialization

1
推荐指数
1
解决办法
276
查看次数