Почему эта частная функция шаблона компилируется?-> Ошибка компилятора VS 2009
-
26-10-2019 - |
Вопрос
Это компилируется без проблем в VS 2009?Я глупый?GCC выдает предупреждение о том, что шаблон является частным....?Что мне не хватает?
#include <iostream>
using namespace std;
class A
{
private:
template<typename T>
A& operator<<(const T & v)
{
cout << v << endl;
return *this;
}
};
int main()
{
A a;
a << 4;
system("pause");
}
Решение
Этот код не должен компилировать - это ошибка (или глупое расширение) по сравнению с Vs. GCC также должен отказаться от этого. Оператор недоступен в прицеле, который используется.
Комо относится к этому правильно:
"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
(declared at line 14) is inaccessible
a << 4;
Изменить: соответствующий стандартный фрагмент, от 13,3/1
Примечание. Функция, выбранная разрешением перегрузки, не гарантированно подходит для контекста. Другие ограничения, такие как доступность функции, могут использовать его в вызывающем контексте плохо сформированным.
Другие советы
Microsoft признает наличие ошибки и заявляет, что она будет исправлена в следующем основном выпуске компилятора (который я прочитал как VC11/VS-whatever-is-after-2010 – возможно, это не пакет обновлений для VC10/VS2010):
Судя по комментариям, исправление уже внесено во внутреннюю сборку компилятора.
Нет, ты не глупый - это сломанный код и должен быть отклонен. Компилятор Comeau (http://www.comeaucomputing.com/tryitout) правильно отвергает это.