テンプレート ポリシー クラスからの保護されたメンバーは、クラス階層が正しいと思われる場合でも、アクセスできないようです。
たとえば、次のコード スニペットを使用します。
#include <iostream>
using namespace std;
template <class T>
class A {
protected:
T value;
T getValue() { return value; }
public:
A(T value) { this->value = value; }
};
template <class T, template <class U> class A>
class B : protected A<T> {
public:
B() : A<T>(0) { /* Fake value */ }
void print(A<T>& input) {
cout << input.getValue() << endl;
}
};
int main(int argc, char *argv[]) {
B<int, A> b;
A<int> a(42);
b.print(a);
}
コンパイラ (OS X では clang ですが、gcc は同じタイプのエラーを返します) は次のエラーを返します。
Untitled.cpp:18:21: error: 'getValue' is a protected member of 'A<int>'
cout << input.getValue() << endl;
^
Untitled.cpp:25:5: note: in instantiation of member function 'B<int, A>::print' requested here
b.print(a);
^
Untitled.cpp:8:7: note: can only access this member on an object of type 'B<int, A>'
T getValue() { return value; }
^
1 error generated.
奇妙なことに、コンパイラからの最後のメモは完全に正しいのですが、b
オブジェクトの型が であるため、既に適用されています'B<int, A>'
。それはコンパイラのバグですか、それともコードに問題がありますか?
ありがとう