C++包装模板化函数
- 我有一个模板类 A,以及 A 的流运算符函数,因此它是一个模板函数。
- 我有一个继承自 A 的类 B,指定模板的类型并添加一些特定于 B 的内容。
- 我正在 B 上编写一个流运算符,它执行特定于 B 的操作,然后回退到编程的其余流操作因为
B 是 A 的子类(你这么称呼它吗?),所以调用 A 的流运算符应该可以工作。事实上,main() 中的operator>>(f,a)
是有效的。但由于某种原因,它不适用于 b 转换为 A。我得到的错误是“没有匹配的函数来调用 'operator>>(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;
}
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
将您的强制转换更改为:
您的原始强制转换创建一个临时变量,您只能获得一个 const 引用。
Change your cast to:
Your original cast creates a temporary which you can only get a const reference to.
问题是您的 C-cast 显然是在创建一个新对象,而不是按预期向上转换。由于这个新对象是临时对象,因此无法将其绑定到父级运算符函数的非常量引用参数。如果您
static_cast
到对父级的引用,它应该可以工作:operator>>( s, static_cast&>(b));
The problem is that your C-cast is apparently creating a new object rather than upcasting as expected. Since this new object is a temporary it can't be bound to the non-const reference parameter to the parent's operator function. If you
static_cast
to a reference to the parent it should work:operator>>( s, static_cast<A<int>&>(b));