回答
模板定義應該是一次解析(之類的東西兩個階段名稱查找的位置,使盡可能多的錯誤,可能可以立即給出而沒有實例化)。實例化使用當時構建的內部數據結構完成。
模板定義(如果你不使用export
或做一些特別的東西,即)在頭文件裏面應該有他們的後衛包括通常。添加一個用於模板定義是無用的,但無害。
你需要包括警衛。考慮以下代碼:
// this is t.h
template <typename T>
void f(T t) {
}
// this is t.cpp
#include "t.h"
#include "t.h"
int main() {
f(1);
}
這給了錯誤:
t.h:2: error: redefinition of 'template<class T> void f(T)'
t.h:2: error: 'template<class T> void f(T)' previously declared here
此外,包含模板的標題通常還包含非模板代碼。
嚴格,這是一個模板函數,而不是一個模板類,但原理是一樣的 - 如果你宣佈你得到的倍數定義錯誤同一班兩次,模板與否。 –
在此處查看我的答案 - http://stackoverflow.com/questions/22595015/c-class-template-undefined-reference-to-function/26816994#26816994 – v010dya
簡短回答:你打算多次包含任何定義的每個單元應該有一個頭部守衛。這是有或沒有模板。
要回答你的第一個問題:是的,這是明智的,而強制性的,有包括圍繞模板類警衛。或者更嚴格地圍繞每個頭文件的全部內容。
這是服從一個定義規則,當你在頭文件中有東西,所以它的周圍,還是安全的共享方式。可能有其他頭文件包含你的。當編譯器編譯一個模塊文件時,它可能會多次看到頭文件的一個#include
,但守護程序會在第二次和後續時間內執行,以確保編譯器僅查看一次該內容。
它並不重要,編譯器可以解決任何問題;這是它的工作。您只需提供一次內容,然後編譯器就可以看到它,並可以根據需要多次重新引用它。
- 1. 包含問題和包括警衛
- 2. 與包含警衛的C問題
- 3. 命名包含警衛
- 4. 如何在類中包含HTML模板?
- 5. C++包括警衛不出現工作?
- 6. C++中的標題警衛
- 7. 函數包括隨機性和警衛
- 8. C++模板:何時將模板參數包含在模板化的結構中?
- 9. 在內部包含其他頭文件包含警衛導致錯誤
- 10. 模板中的模板 - 從模板類型訪問包含的類型
- 11. Angular 2 - 基類包含子類模板
- 12. SAS宏包括警衛
- 13. 在C#中拋出異常,警衛
- 14. 爲什麼在C++中不包括警衛?
- 15. C++模板和類
- 16. 具有重複的警告包括在Objective-C後衛C++頭
- 17. Backbone.js與生態模板:如何在模板中包含模板?
- 18. 模板類包含另一個模板類
- 19. 包含常量類型模板的類的模板?
- 20. C++一個包含多種類型的模板類的std :: vector
- 21. WHMCS中包含Drupal模板?
- 22. 包含在樹枝模板
- 23. 在目標C中包含模板化C++
- 24. 如何在使用模板的類中包含另一個類?
- 25. C預處理器警衛?
- 26. C++模板地圖本身包含
- 27. gsl_odeiv2在c + +類:模板包裝int(...)ode
- 28. 命名空間包含在報頭和模板類
- 29. 模板在C++中,類型名稱和
- 30. 包含typedef的類型專用模板
請務必添加包含警衛,習慣它,因爲這是一個良好的做法。 – Poni
如果你在win32上進行任何開發,只要使用include guard,就包括'#pragma once'。 – KitsuneYMG
+1指出實例使用在第一次掃描時建立的內部數據結構進行 – Otuken