Путаница с typename и, следовательно, ошибки - PullRequest
2 голосов
/ 27 марта 2011
//more code omitted that is not relevant, the IF template is not completely shown here

template <bool condition, typename ThenType, typename ElseType>
    struct IF {
         typedef typename ChooseSelector<condition>::RETURN Selector;
    };

    template <bool condition>
        struct ChooseSelector {
             typedef SelectThen RETURN;
        };

    template <>
        struct ChooseSelector<false> {
             typedef SelectElse RETURN;
        };
//SelectElse and SelectThen omitted

Я получаю Expected nested-name-specifier before ‘ChooseSelector’. Согласно часто связываемому описанию C ++ typename и, если я правильно понял, здесь нужен typename. Если я удаляю typename из шаблона IF, я все равно получаю ту же ошибку, поэтому я немного запутался, что на самом деле вызывает ошибку. Я прочитал много ответов, которые предполагают, что удаление typename решает проблему, но в данном случае это не так. Чего мне не хватает?

Ошибка происходит от g ++ в Linux, VS10 также выдает ошибку.

1 Ответ

2 голосов
/ 27 марта 2011

Поместите свой шаблон IF после шаблона ChooseSelector.

При компиляции шаблона IF, ChooseSelector должен существовать как шаблон, вы используете ChooseSelector<condition>, который анализируется при первом проходе.typename необходим, чтобы сообщить компилятору, что RETURN, который полностью оценивается при создании экземпляра, когда специализации известны, должен рассматриваться как тип для целей первого прохода.

...