因为B是A的子类(你称它为?),调用A的流运算符应该有效。实际上,main()中的operator>>(f,a)
可以正常工作。但由于某种原因,它不适用于B转换为A.我得到的错误是“没有匹配函数调用'运算符>>(std :: basic_istream>&,A)”。
我做错了什么?
以下是示例代码:
#include <stdlib.h>
#include <fstream>
#include <iostream>
using namespace std;
template <class TypeT>
class A
{
public:
A(){a = -9;}
A(TypeT v){a = v;}
TypeT a;
};
class B : public A<int>
{
public:
B(int w) : A<int>(10) {b = w;}
int b;
};
template <class TypeT>
istream &operator>> (istream &s, A<TypeT> &a)
{
cout << "a.a = " << a.a << endl;
return s;
}
istream &operator>> (istream &s, B &b)
{
cout << "b.b = " << b.b << " ";
operator>>( s, (A<int>)b); // error!
return s;
}
int main(void) {
ifstream f("/dev/null");
A<int> a(0);
operator>>( f, a );
B b(1);
operator>>( f, b );
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
将您的演员阵容更改为:
operator>>(s, (A<int> &)b);
您的原始强制转换会创建一个临时表,您只能获得const引用。
答案 1 :(得分:1)
问题在于你的C-cast显然正在创建一个新对象而不是按预期进行向上转换。由于这个新对象是临时的,因此不能将非const引用参数绑定到父的运算符函数。如果你static_cast
引用了父作品,它应该有效:
operator>>( s, static_cast<A<int>&>(b));