【发布时间】:2010-10-13 03:16:16
【问题描述】:
GCC 已经有一段时间没有抓住我了,但它就发生在今天。但我从来不明白为什么 GCC 需要在模板中使用 typedef typename,而 VS 和我猜想 ICC 不需要。 typedef typename 是“错误”还是过于严格的标准,还是留给编译器编写者的东西?
对于那些不知道我的意思的人,这里是一个示例:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
std::map<KEY,VALUE>::const_iterator iter = container.find(key);
return iter!=container.end();
}
上面的代码在 VS 中编译(可能在 ICC 中),但在 GCC 中失败,因为它想要这样:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename
iterator iter = container.find(key);
return iter!=container.end();
}
注意:这不是我正在使用的实际功能,而只是说明问题的一些愚蠢的东西。
【问题讨论】:
-
g++之所以需要它,是因为g++更符合标准。 VS 在模板化解析的这一部分有点松懈(这导致了更复杂的模板中的其他问题)。
-
是的,但是为什么标准的 friggin 会这样做呢?我处理过相同的代码!