Это глоток, поэтому вот пример кода:
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?