У меня есть следующая иерархия классов:
template
class base
{
public:
void f() {}
};
class class_a : public base {};
class class_b : public base,
public class_a
{
using base::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::f() [with T = class_b]’ is inaccessible
test.cpp:14: error: within this context
Я полагаю, что код хорошо формируется, как это, однако я мог быть неправым, я надеюсь кто-то от, ТАКИМ ОБРАЗОМ, сообщество C++ могло обеспечить некоторое понимание этой проблемы.
Примечание: При добавлении "общественности" перед директивой использования в class_b, решает вопрос и для gcc и для VS. Должен раздел средства доступа класса, в котором применяется директива использования, переопределяют режим деривации (общедоступный, частный) базового класса?
Короче говоря это
То, что вы здесь делаете, разрешает двусмысленность, импортируя символ в пространство имен классов private. Следовательно, это затенение метода и изменение его видимости на приватное. Вы не можете иметь две функции с одним и тем же прототипом как private, так и public, поэтому f теперь private.
По крайней мере, GCC считает, что использование должно быть способно изменить видимость функции.
Неясные ссылки, однако, найденные в базе данных ошибок GCC , показывают, что использование на самом деле не должно быть подвержено влиянию области видимости.
Самое главное, прямой ответ (C++ Стандарт '03 -- 7.3.3/15)
Псевдоним, созданный в use-декларации, имеет обычную доступность для member-декларации.
Следовательно ответ будет: