у меня есть следующие иерархии классов:C++ Compiler ошибка с CRTP
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» перед директивой use в классе_b, решает проблему как для gcc, так и для VS. Должен ли раздел доступа класса, в котором применяется директива using, переопределяет режим деривации (открытый, закрытый) базового класса?
Короче это за
- ошибка компиляции - если да, то компилятор GCC, VS или Comeu, Intel
- ли выше код хорошо сформирован?
- Вызывается ли секция доступа, в которой используется директива using, переопределяет режим деривации базы?
Ничто не находится в частном пространстве имен или объема. и директива using не рассматривает часть доступа класса, в котором она вызвана, однако добавление public до того, как директива use решит проблему. Я считаю, что в этом случае gcc и VS виноваты, не так ли? – 2010-02-02 01:44:05
@darid, в приведенной выше ссылке вы увидите, что по крайней мере в случае GCC она была изменена так, как теперь явно. –
@Kornel: Это отличный ответ, я бы хотел добавить, что я попробовал его с компилятором intel C++, и ему нравится, как это происходит с Комо.Интересно, возникает ли проблема с парсерным интерфейсом, Intel и Comeau получают их от EDG, но MS также поддерживает VSC++, что просто путает вещи все больше. – 2010-02-02 02:53:53