我已经编写了一个简单的模板类用于测试目的。它编译没有任何错误,但是当我尝试在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;
}
的 MyNumber.h
#pragma once
template <class T>
class MyNumber
{
public:
MyNumber();
~MyNumber();
void SetValue(T val);
T GetValue();
private:
T m_Number;
};
的 MyNumber.cpp
#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;
}
当我构建此代码时,我收到以下链接器错误:
错误7控制台演示C:\ Development \ IDE \ Visual Studio 2010 \ SAVE \ Grand Solution \ X64 \ Debug \ Console Demo.exe 1错误LNK1120:4个未解析的外部
错误3控制台演示C:\ Development \ IDE \ Visual Studio 2010 \ SAVE \ Grand Solution \ Console Demo \ main.obj错误LNK2019:未解析的外部符号&#34; public:__ cdecl MyNumber ::〜MyNumber(void) &#34; (?? 1?$ MyNumber @ M @@ QEAA @ XZ)在函数wmain
中引用错误6控制台演示C:\ Development \ IDE \ Visual Studio 2010 \ SAVE \ Grand Solution \ Console Demo \ main.obj错误LNK2019:未解析的外部符号&#34; public:__ cdecl MyNumber :: MyNumber(void)& #34; (?? 0?$ MyNumber @ M @@ QEAA @ XZ)在函数wmain中引用
错误4控制台演示C:\ Development \ IDE \ Visual Studio 2010 \ SAVE \ Grand Solution \ Console Demo \ main.obj错误LNK2019:未解析的外部符号&#34; public:float __cdecl MyNumber :: GetValue(void) &#34; (?GetValue @?$ MyNumber @ M @@ QEAAMXZ)在函数wmain中引用
错误5控制台演示C:\ Development \ IDE \ Visual Studio 2010 \ SAVE \ Grand Solution \ Console Demo \ main.obj错误LNK2019:未解析的外部符号&#34; public:void __cdecl MyNumber :: SetValue(float) &#34; (?SetValue @?$ MyNumber @ M @@ QEAAXM @ Z)在函数wmain中引用
但是,如果我将main()留空,我不会得到任何链接器错误。
我的模板类有什么问题?
我做错了什么?
答案 0 :(得分:1)
您无法在cpp文件中实现该模板。您需要在头文件本身中定义类方法。有关详细信息,请参阅此Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?。
答案 1 :(得分:1)
嗯,你实际上应该能够使用export关键字,但几乎没有编译器实现它。您可以通过将非通用代码提取到单独的函数中来解决此问题,并在单独的文件中定义它们。
答案 2 :(得分:1)
您必须为您使用的每个模板参数显式实例化模板。
即,在MyNumber.cpp
文件的末尾添加以下行:
template class MyNumber<float>;
这样,链接器就能找到所需的所有模板实例。