5

这是一口,所以这里以一段代码为例:

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 进行编译。但是,如果 finalvalue_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 的缺陷?

4

1 回答 1

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上打开一个错误报告并将链接发回此处,以便我们对其进行投票。

于 2011-08-12T01:27:58.577 回答