使用嵌套在模板形参中的typename
Using a typename nested in a template parameter
这有点长,下面是一段代码作为示例:
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的缺陷?
这绝对是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报告,然后把链接贴在这里,这样我们就可以投票了
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 可变模板,递归,非typename形参
- 使用嵌套在模板形参中的typename