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

Using a typename nested in a template parameter

本文关键字:形参 typename 嵌套      更新时间:2023-10-16

这有点长,下面是一段代码作为示例:

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的缺陷?

这绝对是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': symbol既不是类模板也不是函数模板

我建议在MS Connect上打开一个bug报告,然后把链接贴在这里,这样我们就可以投票了