如何将模板构造函数专用化移动到 cpp 文件

How to move template constructor specialization to cpp file?

本文关键字:移动 cpp 文件 专用 构造函数      更新时间:2023-10-16

我知道模板的实现应该转到标题的原因。这个问题是关于模板专业化的。据我了解,此设置应该有效。

页眉:

template<class T>
class Foo {
public:
  Foo(T value) {
      // not specialized
  }
};
template<> Foo<double>::Foo(double value);

.cpp:

// specialization for float
template<> 
Foo<double>::Foo(double value) {
    // special version for double
}

用法:

Foo<double>(0);

但是,我收到一个编译器错误:

error LNK2019: unresolved external symbol "public: __thiscall Foo<double>::Foo<double>(double)" (??0?$Foo@N@@QAE@N@Z) referenced in function _wmain

我做错了什么?有没有另一种方法可以将专用构造函数移动到实现文件?

在我看来,

这看起来像是Visual C++编译器中的一个错误,因为代码可以编译和链接并使用MinGW g ++运行良好,但我不确定。

无论如何,以下解决方法标头代码适用于视觉C++。

#pragma once
template<class T>
class Foo
{
public:
    Foo( T )
    {
      // not specialized
    }
};
template<> Foo<double>::Foo( double );
template class Foo<double>;