Почему эта закрытая функция шаблона компилируется? -> Bug VS 2009 - PullRequest
4 голосов
/ 29 апреля 2011

Это компилируется без проблем в 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");
}

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

Microsoft признает ошибку и утверждает, что она будет исправлена ​​в следующем основном выпуске для компилятора (который я прочитал как VC11 / VS-что-то-после-2010 - вероятно, не является пакетом обновления для VC10 / VS2010): 1001 *

из комментариев исправление, похоже, уже сделано для внутренней сборки компилятора.

1 голос
/ 29 апреля 2011

Этот код не должен компилироваться - это ошибка (или глупое расширение) в 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

[Примечание: функция, выбранная разрешение перегрузки не гарантируется быть подходящим для контекста. Другие ограничения, такие как доступность функции, может использовать его в контексте вызова плохо сформирован. ]

0 голосов
/ 29 апреля 2011

Нет, вы не глупы - это неработающий код, и его следует отклонить. Компилятор Comeau (http://www.comeaucomputing.com/tryitout) правильно отклоняет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...