Ошибка компилятора C++ с CRTP

У меня есть следующая иерархия классов:

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. Должен раздел средства доступа класса, в котором применяется директива использования, переопределяют режим деривации (общедоступный, частный) базового класса?

Короче говоря это

  • Ошибка компилятора - раз так, который компилятор GCC, VS или Comeu, Intel
  • Вышеупомянутый код хорошо сформирован?
  • Средство доступа разделяет, в котором называют директиву использования, переопределяют режим деривации основы?

6
задан 2 February 2010 в 03:02
поделиться

1 ответ

То, что вы здесь делаете, разрешает двусмысленность, импортируя символ в пространство имен классов private. Следовательно, это затенение метода и изменение его видимости на приватное. Вы не можете иметь две функции с одним и тем же прототипом как private, так и public, поэтому f теперь private.

По крайней мере, GCC считает, что использование должно быть способно изменить видимость функции.

Неясные ссылки, однако, найденные в базе данных ошибок GCC , показывают, что использование на самом деле не должно быть подвержено влиянию области видимости.

Самое главное, прямой ответ (C++ Стандарт '03 -- 7.3.3/15)

Псевдоним, созданный в use-декларации, имеет обычную доступность для member-декларации.

Следовательно ответ будет:

  • это ошибка в Comeau
  • нет, код не очень хорошо сформирован, по крайней мере на C++03 (не могу найти ничего связанного в C++0x N3000)
  • да, можно изменить область доступа
3
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: