如何解决以下冲突?定义将抽象类的所有派生类作为参数的函数
定义一个返回Abstract的Abstract []中的运算符[]。我想让函数f使用该方法。但是,这不起作用,因为DerivedA的相应运算符[]应该返回DerivedA。然后,Abstract的operator []的返回类型和DerivedA的operator []的返回类型不是协变的。
未定义Abstract中的方法。现在函数f不能建立在Abstract的方法上。可能这意味着必须为Abstract的所有派生类中的每一个编写多个版本的f。
经过一段时间,我意识到我可以enable_if参数有一定的特质,并简单地摆脱了抽象类。有其他可能的解决方案吗?
代码:
class Abstract{
protected:
int val;
public:
//virtual Abstract operator[](int i){} //forget about this.
virtual ~Abstract(){}
};
class DerivedA : public Abstract{
public:
DerivedA(){
val = 0;
}
DerivedA operator[](int i){
DerivedA temp;
temp.val = val + i;
}
};
class DerivedB : public Abstract{
public:
DerivedB(){
val = 0;
}
DerivedB operator[](int i){
DerivedB temp;
temp.val = val*2 + i;
}
};
template <typename T>
//some enable_if here to limit type T to
//DerivedA or DerivedB.
T f(T & X){
return X[1];
}
/*
Abstract f(Abstract & X){
return X[1];
} //forget about this again.
*/
int main(void){
DerivedB B;
DerivedA A;
f(B);
f(A);
}
** - 1 **这是**不是真实的代码**。 –
“下面的代码完全不起作用” - 不是很大一部分是由于语法错误,逻辑错误和缺失标识符过多造成的。给自己一个战斗机会,并至少解决这些问题。 – WhozCraig
我认为如果愚蠢的非实际代码示例被忽略,这可以归结为协变函数模板的问题,C++不支持它作为成员函数。 –