У меня есть следующая иерархия классов:
template <typename T>
class base
{
public:
void f() {}
};
class class_a : public base<class_a> {};
class class_b : public base<class_b>,
public class_a
{
using base<class_b>::f;
};
int main()
{
class_b b;
b.f();
return 0;
}
Comeu и Intel C ++ v11 утверждают, что все хорошо, однако GCC (4.4.1) и VC ++ 2008, похоже, жалуются (http://codepad.org/KQPDsqSp), например:
g++ -pedantic -Wall -o test test.cpp
test.cpp: In function ‘int main()’:
test.cpp:5: error: ‘void base<T>::f() [with T = class_b]’ is inaccessible
test.cpp:14: error: within this context
Я считаю, что код правильно сформирован, но я могу ошибаться, я надеюсь, что кто-то из сообщества SO C ++ мог бы дать некоторое представление об этой проблеме.
Примечание: Добавление «public» перед директивой using в class_b решает проблему как для gcc, так и для VS. Должна ли секция средства доступа класса, в которой применяется директива using, переопределить режим деривации (открытый, закрытый) базового класса?
Короче говоря, это
- Ошибка компилятора - если да, то какой компилятор GCC, VS или Comeu, Intel
- Правильно ли сформирован вышеуказанный код?
- Заменяет ли секция доступа, в которой вызывается директива using, режим деривации базы?