ネストされた typedef の存在を判断しようとする次のコードを検討してください。
#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 を使用しています。