【问题标题】:How to move template constructor specialization to cpp file?如何将模板构造函数专业化移动到 cpp 文件?
【发布时间】:2017-01-09 07:12:24
【问题描述】:

我知道为什么模板的实现应该到头部的原因。这个问题是关于模板专业化的。据我了解,此设置应该可以工作。

标题:

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

我做错了什么?还有其他方法可以将专用构造函数移动到实现文件吗?

【问题讨论】:

  • 我做错了什么?您很可能在创建可执行文件时没有编译和链接 .cpp 文件中的代码。
  • 感谢您的提示,但该文件已包含在二进制文件中。
  • 你这是什么意思?
  • 我的意思是,我检查了文件并编译并链接到可执行文件中。所以这不是问题。
  • 这看起来像是 Visual C++ 编译器中的一个错误。使用 MingW g++ 编译和链接,然后调用该构造函数。

标签: c++ templates constructor template-specialization


【解决方案1】:

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

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

#pragma once

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2012-10-13
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多