c++ - 如何将模板构造函数特化移动到 cpp 文件?

标签 c++ templates constructor template-specialization

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

标题:

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++ 中运行良好,但我不确定。

无论如何,以下变通方法 header 代码适用于 Visual C++。

#pragma once

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

template<> Foo<double>::Foo( double );
template class Foo<double>;

关于c++ - 如何将模板构造函数特化移动到 cpp 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41542767/

相关文章:

c++ - 当我们使用 vector 删除或插入时会发生什么

c++ - 为什么在模板推导过程中没有选择正确的功能

c++ - 无法从 lambda 构建

c++ - 带有常量参数的类声明中的类实例

c++ - 替换 SHDOLCC.DLL 文件以自定义 Web 浏览器的上下文菜单

java - JNI 结构对齐

c++ - C++ 构造函数的问题。这里究竟初始化了什么?

php - 如何在构造函数中调用实体管理器?

c++ - gls库,求一个点和一组点之间的最小距离?

c++ - 为什么模板参数推导/替换在这里失败?