//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也会引发错误。
答案 0 :(得分:2)
将您的IF模板放在ChooseSelector模板之后。
编译IF模板时,ChooseSelector需要作为模板存在,您使用的是ChooseSelector<condition>
,它首先被解析。需要typename
来告诉编译器RETURN
,当知道特化时,在实例化时完全评估的{{1}}应该被认为是第一次传递的类型。