与typename混淆,因此错误

时间:2011-03-27 10:40:38

标签: c++ templates metaprogramming

//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 description,如果我正确理解,则需要typename。如果我从IF模板中删除typename,我仍然会得到相同的错误,所以我有点困惑实际导致错误的是什么。我读了许多答案,表明删除typename可以解决问题,但在这种情况下并非如此。我错过了什么?

错误来自Linux上的g ++,VS10也会引发错误。

1 个答案:

答案 0 :(得分:2)

将您的IF模板放在ChooseSelector模板之后。

编译IF模板时,ChooseSelector需要作为模板存在,您使用的是ChooseSelector<condition>,它首先被解析。需要typename来告诉编译器RETURN,当知道特化时,在实例化时完全评估的{{1}}应该被认为是第一次传递的类型。