gpt4 book ai didi

c++ - 如何定义一个模板类并将其分成多个文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:49 25 4
gpt4 key购买 nike

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


ma​​in.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;
};



我的号码.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;
}



当我构建此代码时,出现以下链接器错误:

Error 7 Console Demo C:\Development\IDE\Visual Studio 2010\SAVE\Grand Solution\X64\Debug\Console Demo.exe 1 error LNK1120: 4 unresolved externals

Error 3 Console Demo C:\Development\IDE\Visual Studio 2010\SAVE\Grand Solution\Console Demo\main.obj error LNK2019: unresolved external symbol "public: __cdecl MyNumber::~MyNumber(void)" (??1?$MyNumber@M@@QEAA@XZ) referenced in function wmain

Error 6 Console Demo C:\Development\IDE\Visual Studio 2010\SAVE\Grand Solution\Console Demo\main.obj error LNK2019: unresolved external symbol "public: __cdecl MyNumber::MyNumber(void)" (??0?$MyNumber@M@@QEAA@XZ) referenced in function wmain

Error 4 Console Demo C:\Development\IDE\Visual Studio 2010\SAVE\Grand Solution\Console Demo\main.obj error LNK2019: unresolved external symbol "public: float __cdecl MyNumber::GetValue(void)" (?GetValue@?$MyNumber@M@@QEAAMXZ) referenced in function wmain

Error 5 Console Demo C:\Development\IDE\Visual Studio 2010\SAVE\Grand Solution\Console Demo\main.obj error LNK2019: unresolved external symbol "public: void __cdecl MyNumber::SetValue(float)" (?SetValue@?$MyNumber@M@@QEAAXM@Z) referenced in function wmain

但是,如果我将 main() 留空,我不会收到任何链接器错误。

我的模板类有什么问题?
我做错了什么?

最佳答案

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

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

template class MyNumber<float>;

这样,链接器将能够找到它需要的所有模板实例化。

另见 Moving Templates Out of Header Files .

关于c++ - 如何定义一个模板类并将其分成多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com