2016-03-10 33 views
5

今天,我的一個朋友和我在一個愚蠢的錯誤中掙扎了很多,我讓我想知道模板參數是如何在C++中工作的。考慮下面的代碼,在那裏我試着部分專業類attr<MyClass<I>>其中Iunsigned int,雖然MyClass預計的int參數:C++模板參數和部分專業化:強或弱打字?

#include <iostream> 

template<int I> 
class MyClass 
{ 

}; 

template<typename T> 
struct attr; 

template<unsigned int I> 
struct attr<MyClass<I>> 
{ 

}; 

int main(int argc, char *argv[]) 
{ 
    attr<MyClass<1>> att; 
    return 0; 
} 

g++失敗,錯誤消息

main.cpp: In function ‘int main(int, char**)’: 
main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined 
    attr<MyClass<1>> att; 

而且clang編譯它(由於att未被使用,所以只發出警告)。

所以我想知道:

  • 是那裏將有利於一方或另一方的統治規範什麼?

  • 難道我們可以說clang模板參數的輸入弱於g++的嗎?

回答

1

是的,至少根據現行標準,GCC拒絕是正確的。也許鏗鏘人在這裏實施一些缺陷報告,我不知道。

http://eel.is/c++draft/temp.deduct.type#17

如果P具有包含<i>,並且如果A的相應值的類型從i的類型而不同,扣除失敗的形式。如果P具有包含[i]的表單,並且如果i的類型不是整數類型,則扣除失敗。

他們在他們的測試套件中的測試用例僅對功能進行測試,因爲它們似乎發出明智的錯誤消息:https://github.com/llvm-mirror/clang/blob/master/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p17.cpp。另外,由於部分專業化不可能被推斷出來,我們也遇到了http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#549,它詢問這樣的結構是否可能被預先拒絕。在我看來,http://eel.is/c++draft/temp.res#8可如果你想被應用:

「知道哪個名稱是類型名稱允許檢查每個模板的語法形成不良的程序,沒有診斷需要,如果:

  • 沒有有效的專業化可以爲模板來生成和模板沒有實例化,或者......」

有觸發該模板的實例化沒有合法的方式,因此你ç應該爭辯說,沒有有效的專業化可以產生它。根據這種解釋,行爲是不確定的,任何事情都是合法的。