Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将模板构造函数专用化移动到cpp文件?_C++_Templates_Constructor_Template Specialization - Fatal编程技术网

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

C++ 如何将模板构造函数专用化移动到cpp文件?,c++,templates,constructor,template-specialization,C++,Templates,Constructor,Template Specialization,我知道为什么模板的实现应该转到页眉。这个问题是关于模板专门化的。据我所知,这个设置应该可以工作 标题: template<class T> class Foo { public: Foo(T value) { // not specialized } }; template<> Foo<double>::Foo(double value); 模板 福班{ 公众: Foo(T值){ //不专业 } }; 模板Foo::Foo(双值);

我知道为什么模板的实现应该转到页眉。这个问题是关于模板专门化的。据我所知,这个设置应该可以工作

标题:

template<class T>
class Foo {

public:
  Foo(T value) {
      // not specialized
  }
};

template<> Foo<double>::Foo(double value);
模板
福班{
公众:
Foo(T值){
//不专业
}
};
模板Foo::Foo(双值);
cpp:

//浮点的专门化
样板
Foo::Foo(双值){
//双人专用版
}
用法:

Foo<double>(0);
Foo(0);
但是,我得到一个编译器错误:

error LNK2019: unresolved external symbol "public: __thiscall Foo<double>::Foo<double>(double)" (??0?$Foo@N@@QAE@N@Z) referenced in function _wmain
错误LNK2019:未解析的外部符号“public:u thiscall Foo::Foo(double)”(?0$Foo@N@@QAE@N@Z) 在函数\u wmain中引用

我做错了什么?是否有另一种方法将特殊的构造函数移到实现文件?

,这看起来像VisualC++编译器中的一个bug,因为代码编译和链接并用MinGW g ++运行,但我不确定。

无论如何,下面的工作区头代码与VisualC++ ++一起工作。

#pragma once

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

template<> Foo<double>::Foo( double );
template class Foo<double>;
#pragma一次
样板
福班
{
公众:
傅(T)
{
//不专业
}
};
模板Foo::Foo(双);
模板类Foo;

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

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

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