2010-03-08 45 views
7

圍繞模板類包含警衛是明智的嗎?模板類和在C++中包含警衛

應該每次用不同的實現中引用它們的時間來重新分析不是模板類?

NB在Visual C++ 2008我沒有得到任何錯誤,兩者結合...

回答

8

模板定義應該是一次解析(之類的東西兩個階段名稱查找的位置,使盡可能多的錯誤,可能可以立即給出而沒有實例化)。實例化使用當時構建的內部數據結構完成。

模板定義(如果你不使用export或做一些特別的東西,即)在頭文件裏面應該有他們的後衛包括通常。添加一個用於模板定義是無用的,但無害。

+5

請務必添加包含警衛,習慣它,因爲這是一個良好的做法。 – Poni

+1

如果你在win32上進行任何開發,只要使用include guard,就包括'#pragma once'。 – KitsuneYMG

+0

+1指出實例使用在第一次掃描時建立的內部數據結構進行 – Otuken

12

你需要包括警衛。考慮以下代碼:

// 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 

此外,包含模板的標題通常還包含非模板代碼。

+2

嚴格,這是一個模板函數,而不是一個模板類,但原理是一樣的 - 如果你宣佈你得到的倍數定義錯誤同一班兩次,模板與否。 –

+0

在此處查看我的答案 - http://stackoverflow.com/questions/22595015/c-class-template-undefined-reference-to-function/26816994#26816994 – v010dya

2

簡短回答:你打算多次包含任何定義的每個單元應該有一個頭部守衛。這是有或沒有模板。

2

要回答你的第一個問題:是的,這是明智的,而強制性的,有包括圍繞模板類警衛。或者更嚴格地圍繞每個頭文件的全部內容。

這是服從一個定義規則,當你在頭文件中有東西,所以它的周圍,還是安全的共享方式。可能有其他頭文件包含你的。當編譯器編譯一個模塊文件時,它可能會多次看到頭文件的一個#include,但守護程序會在第二次和後續時間內執行,以確保編譯器僅查看一次該內容。

它並不重要,編譯器可以解決任何問題;這是它的工作。您只需提供一次內容,然後編譯器就可以看到它,並可以根據需要多次重新引用它。