使用嵌套在模板参数中的typename

时间:2011-08-12 01:02:07

标签: c++ templates nested typename

这是一个满口的,所以这里有一段代码作为例子:

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_typetemplate关键字为前缀,则它将正确编译并运行。我有几个猜测为什么,但找不到标准的相关部分。

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的一部分吗?

1 个答案:

答案 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上打开错误报告,然后将链接发布到此处,以便我们进行投票。