2013-05-11 33 views
2

我知道模板定義應該全部進入頭文件[1]。但是做什麼,如果我有兩個模板和非模板類:哪裏可以同時使用模板和非模板成員定義類?

// cls.h 
class cls { 
public: 
    template <typename U> void bar(U x); // template 
    void baz();       // non-template 
    template <typename V> class nest { 
    }; 
}; 

// foo1.cpp 
#include "cls.h" ... 

// foo2.cpp 
#include "cls.h" ... 

理想我想在同一個文件來定義barbaz,因爲它們是緊密相關的。

  • 但是,如果我在標題中查找所有實現,我將最終定義多個定義baz
  • 如果我扔掉了所有實現成.cpp,然後barnest定義不能被foo1.cppfoo2.cpp看到。

我必須拆分單獨文件之間barbaz

[1] 聲明模板爲inline似乎不適用於使用NVCC編譯CUDA代碼的MSVC++。

+0

將模板聲明爲內聯的意思是什麼?按照當前的答案,將非模板化的baz定義爲內聯,它應該起作用。 – 2013-05-11 10:37:09

回答

5

但是,如果我扔掉所有在標題中實現,我將最終確定乘巴茲。

您仍然可以將baz()的函數定義標記爲inline。這將允許您將baz()的定義放在頭文件中,而不會導致多個符號定義錯誤。

如果我將所有實現查找到.cpp,那麼bar和nest的定義將無法通過foo1.cpp或foo2.cpp查看。

如果你事先知道你的函數模板將與被實例化什麼類型的,你可以使用在包含你的函數模板定義.cpp文件明確實例。

template void cls::bar(int); 

如果沒有上面的選擇對你來說好了,那麼你將不得不放棄這一要求:

理想我想定義欄和巴茲在同一文件中,因爲他們是如此密切相關。

並把在頭文件中的成員函數模板的定義,並在.cpp文件中的非模板成員函數的定義。

+0

謝謝 - 內聯非模板代碼的竅門。但是,如果在頭文件中添加更多內容,會導致臃腫/編譯時間延長? – mchen 2013-05-11 10:43:25

+0

它也提出了問題,編譯器如何處理'inline'代碼 - 我們如何能夠定義'inline'函數? – mchen 2013-05-11 10:44:29

+0

是的。但另一種方法是將baz放入cpp中。您可以隨時將任何非模板化的東西像通常那樣放入cpp中。 – 2013-05-11 10:44:53