ネストされた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を使用しています。
エラーを投稿できますか? –
gccからのエラー 'seom :: value_type {aka struct foo}' seq :: value_type {aka struct foo}のフォワード宣言 ' –
abir
' foo'の定義を後で提供していますか?ポイント、または全く?完全な例(コピー/貼り付け/コンパイルができる)になるようにコードを更新してください。 –