【发布时间】:2011-03-31 00:50:30
【问题描述】:
当我使用时
template <typename TMap>
typename TMap::referent_type * func(TMap & map, typename TMap::key_type key)
{ ... }
第二行的两个“typename”的目的是什么?
它似乎触发了编译时警告(VS2008:C4346),但这只是“你声称这是一种类型”吗?
即实际检查 TMap::referent_type 是否真的是类型是在模板被实例化时进行的,但 C++ 标准似乎仍然有要求,但无论代码是否正确解析。
有没有实际需要类型名来解决歧义的示例?或者还有更多?
【问题讨论】:
-
我必须承认有点惊讶,一个带有 C++ 标签的人会问这样一个关于模板编程的基本问题。您是否曾经使用比 Visual Studio 更好的编译器进行编译? (如,更符合标准)
-
@Mathieu:我使用过 Watcom C++ 9.0-10.5,“观察”C++ 更精细的细节在其中栩栩如生,并且我使用 Comeau 进行了一些测试——尽管从未投入生产。这里真的值得鄙视 VS 吗? --- 我缺少的关键见解是
T::SubType * p将被解析为算术表达式。 --- 我没有注意到我有一个 C++ 标签,但我知道 C++ 仍然大约每月一次让我感到惊讶。