Шаблон C ++, кажется, нарушает спецификаторы доступа - PullRequest
3 голосов
/ 27 июня 2010

Следующий код не компилируется по понятным причинам, а именно, что Foo пытается получить доступ к частному члену Bar. Однако, если вы раскомментируете / комментируете строки, помеченные, делая Foo шаблоном, он компилируется и выводит 42. Что мне здесь не хватает? Почему это работает? Мне кажется, это не должно быть.

Спасибо за вашу помощь.

#include <iostream>

class Bar {
    private:
    static const int x = 42;
};

//template <int>   // uncomment me
struct Foo {
    static const int i = Bar::x;
};

int main(int argc, char* argv[]) {

    std::cout << Foo::i    << std::endl;   // comment me
    //std::cout << Foo<0>::i << std::endl;   // uncomment me
}

Ответы [ 3 ]

5 голосов
/ 27 июня 2010

Если вы видите это поведение, это ошибка компилятора.

И Comeau Online, и Visual C ++ 2010 отклоняют код как недействительный, поскольку Bar::x недоступен.g ++ 4.1.2 неправильно принимает неверный код (кто-то должен будет проверить более позднюю версию, чтобы проверить, исправлена ​​ли она; это единственная версия, которая у меня есть на этом ноутбуке).

3 голосов
/ 27 июня 2010

Это похоже на ошибка GCC 40843 . Он указан как неподтвержденный, но я могу воспроизвести его и на g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3.

0 голосов
/ 27 июня 2010

VisualStudio 2010 сообщает об ошибке C2248: 'Bar :: x' [...] Поскольку форма листа не была указана, я оценил, что предположение ложно почти на Windows VC9.

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