Использование typename, вложенного в параметр шаблона - PullRequest
5 голосов
/ 12 августа 2011

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

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?

1 Ответ

4 голосов
/ 12 августа 2011

Это абсолютный недостаток в части VC ++ 2010 & ndash; 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 и опубликовать ссылку здесь, чтобы мы могли проголосовать за нее.

...