[英]C++: force complete template compilation (MSVC/G++)
你好,祝你好運。
以下代碼片段編譯cl.exe(15.00.30729.01)和mingw-g ++(4.4.0):
template<typename T> class Test{
public:
T t;
void error(){
int doesNotExist = 6;
return doesNotExist;//<---- void function returning result
}
};
int main(int argc, char** argv){
Test<int> test;
return 0;
}
此外,在cl.exe上你甚至可以逃避這樣的事情:
template<typename T> class Test{
public:
T t;
void error(){
doesNotExist = 6;//<---- undeclared variable
return doesNotExist;//<---- void function returning result
}
};
現在,這顯然是因為編譯器在有人調用它們之前不會為模板類的方法創建內容。 但是,當您設計大型模板類時,這可能會出現問題(因為您很可能忘記在某處添加測試調用到新方法)。
問題:
是否有g ++或cl.exe的編譯器開關會強制編譯器處理整個模板(因此這段代碼片段會觸發編譯錯誤)?
如果要使用幾種類型測試模板,可以觸發類型的手動實例化,如:
// at namespace level
template class Test<int>;
類模板的顯式實例化會自動觸發所有成員的實例化,這似乎就是您想要的。
實際問題是該語言旨在明確允許您要避免的行為。 當一個類模板隱式實例化時,編譯器將實例只有那些使用的方法。 該功能的主要用途的情況是,有些方法可能對實體化類型強制規定嚴格的要求比別人,如果所有方法中實例總是那么類模板只能與那些滿足更嚴格的要求類型使用。
通過允許編譯器僅實例化所使用的那些方法,類模板可以與不滿足所有方法的所有要求的類型一起使用,只要它們滿足實際使用的方法的要求即可。 。
一個常見的例子是std::map<>
中的operator[]
,它要求value_type
是可默認構造的 (如果容器中沒有鍵並且返回對它的引用, operator[]
將創建一個新的對象默認初始化 ) 。 只要您不使用operator[]
(或任何其他強制要求的成員函數),語言中的行為允許您對不可默認構造的類型使用std::map
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.