Использование имени типа, вложенного в параметр шаблона

Это полный рот, поэтому вот фрагмент кода как пример:

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

Я знаю, что приведенное выше использование шаблона является расширением Visual Studio, но что делает стандартные говорят об использовании таких типов? Принятие кода gcc также является расширением, или это недостаток со стороны Visual Studio?

5
задан JasonMArcher 7 June 2015 в 01:41
поделиться