2013-10-29 13 views
5

MSVCコンパイラを使用するときにテンプレート化されたクラスで初期化された静的const変数の取得に問題があります。私はMSVC2013、MSVC2012およびMSVC2010を試しました。このコードは、MinGW、MinGW-w64、GCC、およびClangでうまく動作します。MSVCで静的constテンプレートメンバの初期化に失敗する

#include <iostream> 
#include <string> 

using namespace std; 

template <typename T> 
struct StringHolder 
{ 
    static const std::string str; 
}; 

template<> const string StringHolder<int>::str { "integer" }; 

int main() 
{ 
    // prints nothing when compiled with MSVC2013, works with MinGW/GCC/Clang 
    cout << StringHolder<int>::str << endl; 

    return 0; 
} 

答えて

3

MSVC2013でさえも、均一な初期化に関する問題があります。str { "integer" }。それはM $ VCで動作させるために

はバニラの構文を使用します。

template<> const string StringHolder<int>::str = "integer"; 

template<> const string StringHolder<int>::str("integer"); 

template<> const string StringHolder<int>::str = {"integer"}; 

私はここに、より標準に準拠し、GCCまたはメーカーが誰であるかはわかりません。いくつかの勇敢な男がポップアップし、標準条項へのリンクを与えることを望む);

P.S.少なくとも非テンプレートバージョンは正常に動作します。)

struct StringHolder 
{ 
    static const std::string str; 
}; 

const string StringHolder::str{ "integer" }; 

P.P.Sテンプレート、非専門的なバージョンがないも、彼らはサービスパックでそれを修正していただければ幸いです^ _^

template <typename T> 
struct StringHolder 
{ 
static const std::string str; 
}; 

template <typename T> 
const std::string StringHolder<T>::str{ "integer" }; 

xmemory0(611): error C2143: syntax error : missing ';' before '<end Parse>'

コンパイルします。

0

MS VC++ 2010は、初期化リストをサポートしていません。 VC++ 2012もそれらをサポートしていないようです。

+2

しかし、VC++ 2013は、 –

関連する問題