2012-05-14 20 views
3

ネストされたtypedefの存在を判断しようとする次のコードを考えてみましょう。do型は完全型を含む式が必要ですか?

#include<type_traits> 
    struct foo;// incomplete type 
    template<class T> 
    struct seq 
    { 
     using value_type = T; 
    }; 
    struct no_type{}; 
    template<class T> 
    struct check_type : std::true_type{}; 
    template<> 
    struct check_type<no_type> :std::false_type{}; 
    template<class T> 
    struct has_value_type 
    { 
    template<class U> 
    static auto check(U const&)-> typename U:: value_type; 
    static auto check(...)->no_type; 
    static bool const value = check_type<decltype(check(std::declval<T>()))>::value; 
    using type = has_value_type; 
    }; 
    int main() 
    { 
     char c[has_value_type<seq<foo>>::value?1:-1]; 
     (void)c; 
    } 

は今has_value_type<seq>::valueが不完全な型seq<foo>::value_typeの無効な使用など、コンパイルエラーが発生し起動します。 decltypeは完全な型が必要ですか?そうでない場合、どうすればエラーを取り除くことができますか?私はコンパイルにgcc 4.7を使用しています。

+2

エラーを投稿できますか? –

+0

gccからのエラー 'seom :: value_type {aka struct foo}' seq :: value_type {aka struct foo}のフォワード宣言 ' – abir

+0

' foo'の定義を後で提供していますか?ポイント、または全く?完全な例(コピー/貼り付け/コンパイルができる)になるようにコードを更新してください。 –

答えて

3

コードは有効です。decltypeオペランドとして表示されるトップレベル関数呼び出しが、呼び出しがprvalueであっても一時的に導入されないことを定義するC++ 11です。

このルールは、コードを自分のものとして有効にし、戻り値の型(クラステンプレートの特殊化である場合)をインスタンス化しないようにするために追加されました。

2

decltypeには有効な式が必要ですが、不完全な型を含む有効な式を使用できます。あなたのケースでの問題は、しかしUseq<foo>あるとき戻り値の型fooを持って

template<class U> 
auto check(U const&) -> typename U::value_type; 

です。不完全な型を値で返すことはできませんので、形式が正しくない式になります。戻り値の型は、たとえば次のように使用できます。 void_<typename U::value_type>template<typename T> struct void_ {};)、テストが正常に動作しているようです。

+0

それは問題を解決します。 – abir

+0

ありがとうございます。この回答はC++ 11に関する限り間違いです。私は説明を投稿します。 –

関連する問題