«Станд :: шаблона is_convertible:: value ': зависимое имя не является типом;И ошибка C2059: синтаксическая ошибка: '...' - PullRequest
0 голосов
/ 10 декабря 2018

1 、 Когда я компилирую код хрома

    template <class ValidTraits, class... ArgTypes>
    struct AreValidTraits
        : std::integral_constant<
        bool,
        all_of({std::is_convertible<ArgTypes, ValidTraits>::value...}) > {};

, возникает ошибка:

    base\task\task_traits_details.h(169): warning C4346: 'std::is_convertible<ArgTypes,ValidTraits>::value': dependent name is not a type
base\task\task_traits_details.h(169): note: prefix with 'typename' to indicate a type
base\task\task_traits_details.h(171): note: see reference to class template instantiation 'base::trait_helpers::AreValidTraits<ValidTraits,ArgTypes...>' being compiled
base\task\task_traits_details.h(171): error C2059: syntax error: '...'
base\task\task_traits_details.h(169): error C2143: syntax error: missing ';' before '}'
base\task\task_traits_details.h(169): error C2143: syntax error: missing ')' before ';'
base\task\task_traits_details.h(169): error C2143: syntax error: missing '>' before ';'
base\task\task_traits_details.h(169): error C3770: 'unknown-type': is not a valid base class
base\task\task_traits_details.h(169): error C2143: syntax error: missing ',' before ';'
base\task\task_traits_details.h(169): error C2059: syntax error: ')'

2 、 Поэтому я добавляю «typename» перед «std :: is_convertible», нопроблема все еще не решена, вот модифицированный код:

        template <class ValidTraits, class... ArgTypes>
    struct AreValidTraits
        : std::integral_constant<
        bool,
        all_of({typename std::is_convertible<ArgTypes, ValidTraits>::value...}) > {};

и та же ошибка:

base\task\task_traits_details.h(171): error C2059: syntax error: '}'
base\task\task_traits_details.h(171): note: see reference to class template instantiation 'base::trait_helpers::AreValidTraits<ValidTraits,ArgTypes...>' being compiled
base\task\task_traits_details.h(171): error C2143: syntax error: missing ';' before '}'
base\task\task_traits_details.h(171): error C2143: syntax error: missing '>' before ';'
base\task\task_traits_details.h(171): error C3770: 'unknown-type': is not a valid base class
base\task\task_traits_details.h(171): error C2143: syntax error: missing ',' before ';'
base\task\task_traits_details.h(171): error C2059: syntax error: ')'

кажется, что изменение просто решает первое предупреждение.но хром код не проблема, я использую компилятор vs2017.не знаете, что не так с этими ошибками?

вот код функции all_of:

    // Checks if all of the elements in |ilist| are true.
    // Similar to std::any_of for the case of constexpr initializer_list.
    inline constexpr bool all_of(std::initializer_list<bool> ilist) {
        for (auto c : ilist) {
            if (!c)
                return false;
        }
        return true;
    }
...