2010-11-24 75 views
6

有很多在線文檔解釋如何編寫模板方法,但沒有太多關於如何調用它們的例子,以及如何在代碼中使用它們。如何調用模板方法?

我有一個模板方法是這樣的:在代碼

VectorConvertor.h

template <class T> 
static void AppendToVector(std::vector<T> & VectorToBeAppended, 
          std::vector<T> & VectorToAppend);


VectorConvertor.cpp

template <class T> 
void VectorConvertor::AppendToVector(std::vector<T> & VectorToBeAppended, 
            std::vector<T> & VectorToAppend) 
{ 
    for (std::vector::size_type i=0; i<VectorToAppend.size(); i++) 
    { 
     VectorToBeAppended.push_back(VectorToAppend.at(i)); 
    } 
}

使用嘗試:

std::vector<uint8_t> InputData, OutputData; 
// ... 
VectorConvertor::AppendToVector(OutputData, InputData);


我編譯這段代碼沒有任何錯誤。但是,當我試圖用這個方法我收到以下錯誤:

錯誤LNK1120:1周無法解析的外部

錯誤LNK2019:無法解析的外部符號「市民:靜態無效__cdecl VectorConvertor :: AppendToVector(class std :: vector> &,class std :: vector> &)「(?? $ AppendToVector @ E @ VectorConvertor @@ SAXAEAV?$ vector @ EV?$ allocator @ E @ std @@@ std @@ 0 @ Z)在函數「public:staticclass std :: vector>」中引用__cdecl Utf8 :: WStringToUtf8(class std :: basic_string,class std :: allocator>)「(?WStringToUtf8 @ Utf8 @@ SA?AV?$ vector @ EV?$ allocator @ E @ std @@@ std @@ V? $ @的basic_string _WU?$ @ char_traits @ _W性病@@ V'$ @分配器@ _W 2 @@ 3 @@ Z)


當我沒有在我的代碼中使用此方法我沒有收到任何錯誤消息。調用它時我做錯了什麼?我錯過了什麼嗎?


我使用Visual Studio 2010 Express版本。

+1

沒有幫助的,但這些類型的錯誤信息只是reas爲什麼我停止使用C++編碼。 – 2010-11-24 19:30:20

+0

爲了清楚起見,不要將`template method`(這是一個設計模式)與`class template member function`和`function template`混淆。 – 2010-11-24 19:39:15

回答

5

您需要將函數的主體放在頭文件中。請參閱this FAQ

2

模板聯可能很麻煩。但最簡單的解決方案通常是:

將所有模板定義放在頭文件中。

在這種情況下,您應該將VectorConverter.cpp的內容移動到VectorConverter.h(或者可能位於VectorConverter.h底部的#include "VectorConverter.cpp")。

0

除了在頭文件中放置模板函數的定義或者包含源文件(cpp文件)之外,還可以顯式實例化您的函數以獲取所需的類型。

0

這些錯誤是因爲試圖在CPP文件中寫入模板方法的定義。爲了減少鏈接時間,在頭文件中編寫內聯和模板方法的實現(定義)是一個規則。下面的代碼是聲明和定義模板方法的正確方法。

VectorConvertor.h

class VectorConvertor 
{ 
    public: 
     template <class T> 
     static void AppendToVector1(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 

     template <class T> 
     static void AppendToVector2(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 

     template <class T> 
     static void AppendToVector3(  std::vector<T> & VectorToBeAppended, 
            const std::vector<T> & VectorToAppend); 


} 

template <class T> 
void VectorConvertor::AppendToVector1(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.reserve(VectorToBeAppended.size() + VectorToAppend.size()); 
    for (std::vector<T>::size_type i=0; i<VectorToAppend.size(); i++) 
    { 
     VectorToBeAppended.push_back(VectorToAppend[i]); 
    } 
} 

template <class T> 
void VectorConvertor::AppendToVector2(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.reserve(VectorToBeAppended.size() + VectorToAppend.size()); 
    for (std::vector<T>::const_iterator cit=VectorToAppend.cbegin(); cit!=VectorToAppend.cend(); ++cit) 
    { 
     VectorToBeAppended.push_back(*cit); 
    } 
} 

template <class T> 
void VectorConvertor::AppendToVector3(   std::vector<T> & VectorToBeAppended, 
             const std::vector<T> & VectorToAppend) 
{ 
    VectorToBeAppended.insert(VectorToBeAppended.end(), VectorToAppend.cbegin(), VectorToAppend.cend()); 
} 

VectorConvertor.cpp

// Nothing to write in the CPP file. 

而且,這是如何在代碼中使用它:

std::vector<uint8_t> InputData, OutputData; 
// ... 
VectorConvertor::AppendToVector3(OutputData, InputData);