这是一个满口的,所以这里有一段代码作为例子:
template<typename T>
void foo(const T& a, typename T::value_type::value_type b) { }
std::vector<std::vector<int>> vec;
foo(vec, 4); // Error, can't specialize function template
使用gcc编译并正确运行。由于上面评论的原因,它无法使用Visual Studio 2010进行编译。但是,如果最终value_type
以template
关键字为前缀,则它将正确编译并运行。我有几个猜测为什么,但找不到标准的相关部分。
template<typename T>
void foo(const T& a, typename T::value_type::template value_type b) { }
std::vector<std::vector<int>> vec;
foo(vec, 4); // Compiles and runs correctly with Visual Studio 2010
我知道template
的上述用法是Visual Studio扩展,但标准对使用这样的类型有什么看法呢? gcc对代码的接受是否也是一个扩展,或者这是Visual Studio的一部分吗?
答案 0 :(得分:4)
这绝对是VC ++ 2010的一部分 - std::vector<int>::value_type
是一种类型,而不是模板,不应该这样装饰。实际上,在此上下文中使用该语法应该导致编译器错误。
支持证据是以下编译(应该如此):
#include <vector>
template<typename T>
void foo(T const& a)
{
typename T::value_type::value_type bar = a.at(0).at(0);
}
int main()
{
std::vector<std::vector<int>> vec;
foo(vec);
}
以下不是(因为它不应该):
template<typename T>
void foo(T const& a)
{
typename T::value_type::template value_type bar = a.at(0).at(0);
}
产生的错误
错误C2903:
'value_type'
:符号既不是类模板也不是函数模板
我建议在MS Connect上打开错误报告,然后将链接发布到此处,以便我们进行投票。