它看起來像編譯器接受不同的語法來初始化模板中的靜態。模板專業化靜態初始化icc + vc vs 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