2016-07-04 28 views
2
#include <iostream> 
#include <type_traits> 


namespace MyNS { 
    struct Test1 {}; 
    template <typename > class Test; 

    template <> class Test<Test1> { 
     public: 
      constexpr static char const *description[] = { "X1", "Y1",}; 
    }; 
    constexpr char const *Test<Test1>::description[]; 
    static const char * getDesc(int i) { 
     return MyNS::Test<MyNS::Test1>::description[i]; 
    } 
} 

int main() 
{ 
    std::cout << MyNS::getDesc(0) << std::endl; 
} 

これはMSVC(エラーC2373: '説明':再定義;異なるタイプ修飾子)で失敗しますが、GCC 4.8で正常にコンパイルされます。MSVCエラー - エラーC2373: 'description':再定義。異なるタイプ修飾子

MSVCとGCCの両方を使って正常に構築するための回避策はありますか?

+0

Fyi、それはまた、clang 3.8で問題なくコンパイルされます。 – WhozCraig

答えて

1

MSVCは、正確な配列の長さに私たちを望んでいる、これは動作するはずと思われる:

#include <iostream> 
#include <type_traits> 


namespace MyNS { 
    struct Test1 {}; 
    template <typename > class Test; 

    template <> class Test<Test1> { 
     public: 
      constexpr static char const *description[2] = { "X1", "Y1",}; 
    }; 
    constexpr char const *Test<Test1>::description[]; 
    static const char * getDesc(int i) { 
     return MyNS::Test<MyNS::Test1>::description[i]; 
    } 
} 

int main() 
{ 
    std::cout << MyNS::getDesc(0) << std::endl; 
} 

EDIT:あなたは正確に最初の定義の長さを持っています。

2

説明の再定義を削除してコンパイルします。あなたはまた、torからメインから値を返す必要があります。

#include <iostream> 
#include <type_traits> 


namespace MyNS { 
    struct Test1 {}; 
    template <typename > class Test; 

    template <> class Test<Test1> { 
     public: 
      constexpr static char const *description[] = { "X1", "Y1",}; 
    }; 

    //constexpr char const *Test<Test1>::description[]; 

    static const char * getDesc(int i) { 
     return Test<Test1>::description[i]; 
    } 
} 

int main() 
{ 
    std::cout << MyNS::getDesc(0) << std::endl; 
    return 0; 
} 
+0

これは非常に単純な "再現コード"で動作しますが、別のobjからあなたのconstexprにリンクしたい場合、例えば別のcppでそれを再定義する必要があります。 –

+0

クラス定義全体をヘッダファイルに入れます。どこに置いても、constexpr定義を使用するにはデータの割り当てが必要です。 – tukra

+0

あなたは正しいです、私はかつて静的なconstexprとのリンク時に参照されていないシンボルエラーに直面していたので、それが必要だったと思いました。しかし今ではありません!ありがとう! –

関連する問題