2013-04-12 150 views
24

的在Class.h實例化模板成員函數

class Class { 
public: 
    template <typename T> void function(T value); 
}; 

Class.cpp

template<typename T> void Class::function(T value) { 
    // do sth 
} 

main.cpp

#include "Class.h" 

int main(int argc, char ** argv) { 
    Class a; 
    a.function(1); 
    return 0; 
} 

我得到一個鏈接錯誤,因爲Class.cpp從來沒有實例void Class::function<int>(T)。 您可以顯式實例使用模板類:

template class std::vector<int>; 

你如何明確實例化一個非模板類的模板成員?

感謝,

+0

我問這個問題的背景下,這篇博客文章涉及升壓轉換器的序列化庫:http://www.timoch.com/blog/2013/04/boost-serialization-coupling-issue/ – TiMoch

回答

36

您可以使用下面的語法Class.cpp

template void Class::function(int); 

模板參數可以因爲類型推演,這適用於功能模板被省略。因此,上述相當於以下,只是更加簡潔:

template void Class::function<int>(int); 

注意,這是沒有必要指定函數參數的名字 - 他們不是一個函數(或函數模板的)簽名的一部分。

+0

這種形式,沒有明確指定模板參數,也可以工作。 – TiMoch

+0

@TiMoch:正如我在答案中寫的那樣,它是因爲類型扣除而起作用的。另外,請注意寫入參數名稱是不必要的。 –

+0

我標記你的答案,因爲它現在是最完整的。 – TiMoch

5

您是否嘗試過在Class.cpp以下?

template void Class::function<int>(int value); 
+0

我已經嘗試過,但似乎沒有實例化模板。我使用gcc v4.7.2。編譯成功,但我仍然在鏈接時獲得'未定義的引用void class :: function (int)' – TiMoch

+2

Nevermind,這實際上工作。在我的makefile中犯了一個錯誤......我現在感到很傻: - | – TiMoch