2009-02-15 54 views
1

我將函數轉換爲模板,並開始出現此錯誤。我不能理解模板的限制。有人能告訴我爲什麼這是壞的?當我鏈接下面的代碼使用模板鏈接錯誤

Undefined symbols: 
    "bool foo<int>(int const&, int const&)", referenced from: 
     _main in file1.o 
ld: symbol(s) not found 

我收到此錯誤。代碼被簡化了,但仍然失敗。第一個文件包含:

#include <iostream> 
template <class T> bool foo (const T&, const T&); 

int main() 
{ 
    int left = 1; 
    int right = 2; 

    if (foo <int> (left, right)) 
    std::cout << "foo!" << std::endl; 

    return 0; 
} 

而第二個文件包含:

template <class T> bool foo (const T& left, const T& right) 
{ 
    return true; 
} 

回答

3

由於Uri給出的原因,模板方法通常在頭文件中定義。因爲你是一個函數而不是一個類的方法,所以在靜態或內聯中明確地定義它(在可能被多個CPP文件包含的頭文件中)。

把這個在你的foo.h中

template<class T> inline bool foo (const T& left, const T& right) 
{ 
    return true; 
} 

在你的main.cpp

#include <iostream> 
#include "foo.h" 

int main() 
{ 
    int left = 1; 
    int right = 2; 

    if (foo <int> (left, right)) 
    std::cout << "foo!" << std::endl; 

    return 0; 
} 

CPP的代碼現在看到的模板函數的整個聲明將這個。

此處列出了其他解決方案:How can I avoid linker errors with my template functions?

+0

static/inline mods沒有任何作用。我很難過。 – 2009-02-15 03:03:59

2

它已經多年,因爲我做了很多C++,但我認爲你遇到不同的編譯的問題。模板在編譯時被實例化,而不是鏈接。

因此,當您調用foo()時,您並沒有真正實例化模板,因爲沒有生成新的函數代碼,您只需創建鏈接器必須解決的符號。

但是,當編譯第二個文件時,它只有模板,並且它從不實例化,因此不會生成實際處理整數的foo()版本。因此,當你把所有東西鏈接在一起時,你會得到錯誤。

我不是100%確定該怎麼做,但我懷疑你需要強制在第二個文件(假設它是C++)中用ints強制實例化foo()。 我只使用類模板,而不是函數模板,我敢肯定這裏有人會給你幾個確切的代碼...