2013-07-24 69 views
-2

我有一個簡單模板函數定義的模板函數,C++調用單獨的頭和cpp文件

#include <iostream> 
#include <vector> 

using namespace std; 

template<class T> 
pair<T, T> GetMatchedBin(T, vector<pair<T, T> >); 

A.cpp

#include "A.h" 

template<class T> 
pair<T, T> GetMatchedBin(T val, vector<pair<T, T> > &bins) 
{ 
    for(unsigned int i=0; i<bins.size(); i++){ 
     if(val >= bins[i].first && val < bins[i].second) 
      return bins[i]; 
    } 
    return pair<T, T>(); 
} 

我通過打電話,

main.cpp

#include <iostream> 
#include <vector> 
#include "A.h" 

using namespace std; 

int main() 
{ 
    vector<pair<int, int> > bins; 
    bins.push_back(pair<int, int>(0, 1)); 
    bins.push_back(pair<int, int>(1, 2)); 
    bins.push_back(pair<int, int>(2, 3)); 
    bins.push_back(pair<int, int>(3, 4)); 

    pair<int, int> matched_bin = GetMatchedBin(3, bins); 

    cout << matched_bin.first << ", " << matched_bin.second << endl; 

    return 0; 
} 

然而,當我嘗試編譯此我得到的錯誤,

make 
g++ -o temp temp.cpp A.o 
/tmp/dvoong/ccoSJ4eF.o: In function `main': 
temp.cpp:(.text+0x12a): undefined reference to `std::pair<int, int> GetMatchedBin<int>(int, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >)' 
collect2: ld returned 1 exit status 
make: *** [temp] Error 1 

奇怪的是,如果我做的這一切都在一個文件中,而不是分成頭和.cpp文件,然後它工作.. 。

任何想法是什麼造成這種情況?

感謝

+0

見http://stackoverflow.com/q/495021/951890 –

回答

2

編譯器需要在編譯時模板的完整定義。因此,模板函數的定義需要在標題中。 (除非你專門,是要在一個C++文件或內聯)

+0

謝謝,你的回答只是讓我想起了我以前已經有過這個問題,一旦 – scruffyDog