我遇到了另一个我不明白的问题。
以下没有实例化(参数实例化失败),为什么?
template<class E>
void operator[](typename boost::mpl::identity<E>::type e) const;
谢谢你的帮助
答案 0 :(得分:10)
identity
可用于强制您明确指定模板参数。它有效地防止了函数参数参与模板参数推导。
限定类型名称是非推断的上下文之一;也就是说,identity<E>::type
不会用于推导E
的模板参数。
例如,如果你有:
template<class E>
void f(typename boost::mpl::identity<E>::type e) { }
f(42); // won't work
f<int>(42); // works
答案 1 :(得分:0)
这似乎非常多余。 identity<E>::type
保证等同于E
,为什么不将模板声明为:
template<class E>
void operator[](E e) const;