class A {
protected:
int fooA;
A() : fooA(0) {}
};
class B {};
template<typename T>
class C : public A {
public:
using A::A;
void fooF(T& element) {
element.fooA = 1;
}
};
class D : public C<B>, public B {
using C::C;
};
int main() {
D d1;
D d2;
d1.fooF(d2);
return 0;
}
error: ‘const class B’ has no member named ‘fooA’ element.fooA = 1;
似乎T
特别指向B
,它会将d2
转换为其父类(B
),我该怎么做才能避免这种情况?
(我需要这样做,所以我不能改变其继承的类数)。
感谢。
答案 0 :(得分:1)
似乎当T特殊化为B时,它将d2转换为其父类(B),我该怎么做才能避免这种情况?
请勿接纳T
中的fooF
。取一个T
就是切割对象并只给你B
部分。如果您改为使用C<T>
,则可以访问该对象的A
部分。此外,fooF
正在使用const
变量,因此您无法对其进行修改。将其更改为引用,因此更改将粘贴到您传递的对象将为您提供
void fooF(C<T>& element) {
element.fooA = 1;
}
答案 1 :(得分:1)
不确定你究竟想要什么...但我怀疑你想要什么
template<typename T>
class C : public A {
public:
using A::A;
template <typename U>
typename std::enable_if<std::is_base_of<C<T>, U>::value>::type
fooF (U element)
{ element.fooA = 1; }
};
我的意思是......模板fooF()
,它会收到C<T>
派生类型。
或者可能是B
派生类型
template <typename U>
typename std::enable_if<std::is_base_of<B, U>::value>::type
fooF (U element)
{ element.fooA = 1; }