2016-08-10 9 views
1

テンプレート内のstaticの初期化に対して、コンパイラが異なる構文を受け入れるようです。テンプレートの特殊化静的初期化icc + vcとgcc + clang

template <typename T> struct TBase 
{ 
    static const int i; 
    static const int j; 
}; 

// compile: gcc + clang + visual + icc 
template <> const int TBase<double>::i=1; 

// compile: vc + icc 
// failed gcc, gcc -fpermissive, clang 
const int TBase<double>::j=2; 

それは現時点では明らかにポータブルではない場合でも、標準で受け入れtemplate<>なし構文ですか?

編集: vC++ TBase<double>::i==1およびTBase<double>::j==2のこのコードは、テンプレートなしのコードとまったく同じです。

struct noTemplate 
{ 
    static const int i; 
    static const int j; 
}; 
const int noTemplate::i=1; 
const int noTemplate::j=2; 

gccと打ち鳴らすには、コンパイラは、この情報を必要とする理由私は見ていない、このスタティックを初期化するtemplate<>の使用を強制するようです。

答えて

3

2つのシンタックスは両方とも有効ですが、彼らは別のものを意味します。暗黙的または明示的インスタンスのメンバを宣言または定義するために使用されるtemplate<>と構文:

template<> struct X<float> { static int const j; }; // Class template specialization 
int const X<float>::j = 3; 
+0

ありがとうございます。したがって、暗黙的なインスタンス化は、テンプレートのローカル使用、libのようなテンプレートのエクスポートの明示的なインスタンス化です。 vC++では、テンプレート宣言とint const X :: j = 3のような値の初期化が行われます。コード(x ())。jが "有効"であれば十分です。ちょっと奇妙です。 – ColdCat

0

はい、標準を満たしているようです。

少なくともC++ 14標準が含まれています(最終リビジョンにも含まれていますので、プレリリースバージョンhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdfで確認しました)。

14.7.1暗黙のインスタンス生成 ... クラステンプレートまたはメンバー・テンプレートのメンバーは、明示的にインスタンス化または明示的に特化されていない限り、専門の中で参照されたときにメンバーの専門性を暗黙的にインスタンス化されますメンバー定義が存在する必要があるコンテキスト。静的データメンバの定義が必要な方法で静的データメンバ自体が使用されていない限り、静的データメンバの初期化(および関連する副作用)は発生しません。 const int TBase<double>::j=0;することによって、あなたがアクセスしている ...

、静的メンバTBase<double>j(専門ではない)ので、TBase<double>特殊化はまだ存在しない場合は作成する必要があります。

あなただけの構造体のメンバにアクセスしていることを証明しているテンプレートなしのコードサンプル、:

struct WithoutTemplate { 
    static const int i; 
}; 
const int WithoutTemplate::i = 5; 
+0

template<class T> struct X { static int const i; }; template<> int const X<char>::i = 1; // Define member of an implicit instantiation template struct X<long>; template<> int const X<long>::i = 2; // Define member of an explicit instantiation 

構文template<>せずは、専門のメンバーを定義するために使用されありがとう、私は私の質問を強調するために私の質問を更新しました。 – ColdCat

関連する問題