2016-03-10 17 views
5

今日、私の友人と私は愚かな間違いで多くの苦労をしました。テンプレートパラメータがC++でどのように機能するか疑問に思っています。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はそれをコンパイルエラーメッセージで失敗します。MyClassintパラメータを見込んでいますが、私は部分的にクラスIunsigned intあるattr<MyClass<I>>を専門にしようと、次のコードを、考えてみましょう(attが使用されていないことによる警告のみ)。

だから私は思っていた:

  • は、どちらか一方の賛成で支配するだろうスペックに何がありますか?

  • clangテンプレートパラメータのタイピングは、g++のものよりも弱いですか?

答えて

1

はい、GCCは少なくとも現在の標準によれば拒否するのは正しいです。多分Clangの人々はここにいくつかの欠陥報告を実装している、私は知らないだろう。 Pは、<i>を含み、Aの対応する値のタイプは、I型と異なる場合、控除が失敗した形状を有している場合

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

。 Pが[i]を含む形式を持ち、iの型が整数型でない場合、控除は失敗します。

testsuiteのテストケースでは、これは、合理的なエラーメッセージ: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が適用され得る:

「、必要な名前が型名あるかを知ることは、プログラムが悪い形成されているすべてのテンプレートの構文をチェックすることができ、ノー診断の場合:。

  • 有効な特殊化は、テンプレートのために生成することができ、そのテンプレートがインスタンス化されていない、または...」

そのテンプレートのインスタンス生成をトリガする法的方法はありません、それゆえにC ouldは、それに対して有効な特殊化は生成できないと主張する。その解釈の下で、行動は未定義であり、何かが合法である。

関連する問題