簡體   English   中英

如何定義模板類並將其划分為多個文件?

[英]How do I define a template class and divide it into multiple 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 << "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:未解析的外部符號“public:__ cdecl MyNumber ::〜MyNumber(void)”(?? 1? $ MyNumber @ M @@ QEAA @ XZ)在函數wmain中引用

錯誤6控制台演示C:\\ Development \\ IDE \\ Visual Studio 2010 \\ SAVE \\ Grand Solution \\ Console Demo \\ main.obj錯誤LNK2019:未解析的外部符號“public:__ cdecl MyNumber :: MyNumber(void)”(?? 0?$ MyNumber @ M @@ QEAA @ XZ)在函數wmain中引用

錯誤4控制台演示C:\\ Development \\ IDE \\ Visual Studio 2010 \\ SAVE \\ Grand Solution \\ Console Demo \\ main.obj錯誤LNK2019:未解析的外部符號“public:float __cdecl MyNumber :: GetValue(void)”(?GetValue @? $ MyNumber @ M @@ QEAAMXZ)在函數wmain中引用

錯誤5控制台演示C:\\ Development \\ IDE \\ Visual Studio 2010 \\ SAVE \\ Grand Solution \\ Console Demo \\ main.obj錯誤LNK2019:未解析的外部符號“public:void __cdecl MyNumber :: SetValue(float)”(?SetValue @? $ MyNumber @ M @@ QEAAXM @ Z)在函數wmain中引用

但是,如果我將main()留空,我不會收到任何鏈接器錯誤。

我的模板類有什么問題?
我究竟做錯了什么?

您必須為您使用的每個模板參數顯式實例化模板。

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

template class MyNumber<float>;

這樣,鏈接器將能夠找到它需要的所有模板實例化。

另請參閱從標頭文件移出模板

您無法在cpp文件中實現該模板。 您需要在頭文件本身中定義類方法。 請參閱此為什么我不能將模板類的定義與其聲明分開並將其放在.cpp文件中? 欲獲得更多信息。

好吧,你實際上應該能夠使用export關鍵字,但幾乎沒有編譯器實現它。 您可以通過將非通用代碼提取到單獨的函數中來解決此問題,並在單獨的文件中定義它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM