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++ 如何定义模板类并将其划分为多个文件?_C++_Templates_Linker Errors_Header Files - Fatal编程技术网

C++ 如何定义模板类并将其划分为多个文件?

C++ 如何定义模板类并将其划分为多个文件?,c++,templates,linker-errors,header-files,C++,Templates,Linker Errors,Header Files,为了测试,我编写了一个简单的模板类。它编译时没有任何错误,但当我尝试在main()中使用它时,它会给出一些链接器错误。 main.cpp #include <iostream> #include "MyNumber.h" int wmain(int argc, wchar_t * argv[]) { MyNumber<float> num; num.SetValue(3.14); std::cout << &qu

为了测试,我编写了一个简单的模板类。它编译时没有任何错误,但当我尝试在main()中使用它时,它会给出一些链接器错误。


main.cpp

#include <iostream>
#include "MyNumber.h"

int wmain(int argc, wchar_t * argv[])
{
    MyNumber<float> num;
    num.SetValue(3.14);
    std::cout << "My number is " << num.GetValue() << "." << std::endl;
    
    system("pause");
    return 0;
}
#include "MyNumber.h"

template <class T>
MyNumber<T>::MyNumber()
{
    m_Number = static_cast<T>(0);
}

template <class T>
MyNumber<T>::~MyNumber()
{
}

template <class T>
void MyNumber<T>::SetValue(T val)
{
    m_Number = val;
}

template <class T>
T MyNumber<T>::GetValue()
{
    return m_Number;
}
#包括
#包括“MyNumber.h”
int wmain(int argc,wchar_t*argv[])
{
mynum;
数值设定值(3.14);

std::cout您不能在cpp文件中实现模板。您需要在头文件本身中定义类方法。有关详细信息,请参阅此部分。

实际上,您应该能够使用关键字,但几乎没有编译器实现它。您可以通过将非泛型代码提取到单独的函数(例如d在单独的文件中定义这些参数。

您必须为使用的每个模板参数显式实例化模板

即,在
MyNumber.cpp
文件末尾添加以下行:

template class MyNumber<float>;
模板类MyNumber;
这样,链接器将能够找到它需要的所有模板实例化


另请参见。

我知道模板方法只能在头文件中定义。模板类也是这样吗?是的,类也是这样,除非您的编译器支持
export
关键字(这在我的经验中是罕见的)
template class MyNumber<float>;