2016-04-21 7 views
0

テンプレート条件に使用しようとしている構造体をテストしていますが、奇妙なコンパイルエラーが発生しています。ここに私のコードは次のとおりです。boolとsizeof条件付きテンプレート

#include <type_traits> 
#include <string> 

template<typename T1, typename T2, 
    bool SAME_SIZE = (sizeof(T1)==sizeof(T2))> 
struct same_size 
{ 
    typedef typename std::false_type value; 
}; 
template<typename T1, typename T2> 
struct same_size<T1, T2, true> 
{ 
    typedef typename std::true_type value; 
}; 

int main() 
{ 
    if(same_size<char,unsigned char>::value) 
    { 
     printf("yes"); 
    } 
    system("PAUSE"); 
} 

私は、Visual Studioで2015年までこれらを、これをコンパイルしてる私が手コンパイルエラーです:

1> main.cpp 
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(18): error C2059: syntax error: ')' 
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(19): error C2143: syntax error: missing ';' before '{' 

誰もがここで何が起こっているかのよういくつかの光を当てることができますか?

+0

'typedef'に' typename'を入れる必要はありません。あなたのエラーを修正する別の方法は、 'value' - ' if(same_size :: value {}) 'をインスタンス化することですが、セルゲイの答えはこれを修正する正しい方法です。 – Praetorian

答えて

2

あなたはvalueを値としてではなくタイプとして持っています。だからifの状態では使用できません。あなたができる最も良いことは、継承を使用して入力を省くことです。そのような:

#include <type_traits> 
#include <string> 

template<typename T1, typename T2, 
    bool SAME_SIZE = (sizeof(T1)==sizeof(T2))> 
struct same_size : std::false_type 
{ 
}; 

template<typename T1, typename T2> 
struct same_size<T1, T2, true> : std::true_type 
{ 
}; 

int main() 
{ 
    if(same_size<char,unsigned char>::value) 
    { 
     printf("yes"); 
    } 
    system("PAUSE"); 
} 

別の(私の見解では、より良い)溶液を@GManNickGによって示唆された:最初に:上記の

template<typename T1, typename T2> 
struct same_size : std::integral_constant<bool, sizeof(T1) == sizeof(T2)> {}; 

利点は、当然のことながら、より少ないタイピングとエラーが発生しにくいとされていますあなたはまだsame_size<int, int, false>::valueと書くことができ、間違った結果を得ることができます。

そして第二の溶液の美しさは、後者がintegral_constant対応するためtypedefsであるとして、それは依然として、true_typefalse_typeと互換性の農産物の種類を行っていることです。

サイドノートでは、テンプレートメタプログラミングとprintfを同じコードで見ると、1対の馬が描くスペースシャトルを見るようなものです。

+0

ええ、私は物事をテストしようとしていたので、私はprintfを使っていました。ありがとう! – Finke

+0

なぜ彼らはいつもスペースシャトルのエンジンのパワーを馬力で報告していると思いますか?ちょうどために、彼らは彼らが必要とする人の数を知っているでしょう。 –

+0

'template struct same_size:std :: integer_constant sizeof(T2)> {};'、さらに簡単です。 (または 'std :: bool_constant <>' C++ 17で) – GManNickG