Скачал последний qt 5.3.0 c MinGW 4.8.2 и удивился. (тоже самое и с qt 5.2.0 с MinGW 4.8.0)
#include
using namespace std;
template
int main()
{
cout << "Hello World!" << endl;
return 0;
}
Не работает. Выдаёт:
C:\***\main.cpp:14: ошибка: 'a' was not declared in this scope
b = a;
^
Хотя, убрать строку template
Ответ
Кажется, я понял. Вот тут обсуждают похожую проблему.
В вашем случае ситуация такова. b является зависимым именем. Компилятор должен понять значение этого зависимого имени до подстановки T. (Посмотрите детали и обсуждение в этом вопросе). Поскольку он не может, разработчики стандарта решили убрать зависимые имена из области видимости внутри шаблона. Поэтому вам приходится указывать явно, что именно вам нужно.
Таким образом, баг в старом Visual Studio, их реализация не вполне соответствовала стандартам. (В новом Visual Studio уже соответствует.)
Я считаю, что язык C++ неоправданно избыточно сложен. Вы натолкнулись на одно из таких мест.
Комментариев нет:
Отправить комментарий