次のクラス階層があります。
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++ コミュニティの誰かがこの問題について何らかの洞察を提供してくれることを願っています。
注: class_b の using ディレクティブの前に「public」を追加すると、gcc と VS の両方の問題が解決されます。using ディレクティブが適用されるクラスのアクセサー セクションは、基本クラスの派生モード (パブリック、プライベート) をオーバーライドする必要がありますか?
要するにこれ
- コンパイラ エラー - その場合、コンパイラは GCC、VS、Comeu、Intel のいずれか
- 上記のコードは整形式ですか?
- using ディレクティブが呼び出されるアクセサ セクションは、ベースの派生モードをオーバーライドしますか?