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