C++ C++;包装模板函数 我有一个模板类a和一个流操作符函数a,因此它是一个模板函数 我有一个从a继承的类B,为模板指定了一个类型,并添加了一些特定于B的内容 我正在B上编写一个流操作符,它执行特定于B的操作,然后返回到为a编程的其余流操作
因为B是a的一个子类(你这样称呼它吗?),调用a的流操作符应该是可行的。实际上,C++ C++;包装模板函数 我有一个模板类a和一个流操作符函数a,因此它是一个模板函数 我有一个从a继承的类B,为模板指定了一个类型,并添加了一些特定于B的内容 我正在B上编写一个流操作符,它执行特定于B的操作,然后返回到为a编程的其余流操作,c++,templates,operator-overloading,subclass,C++,Templates,Operator Overloading,Subclass,因为B是a的一个子类(你这样称呼它吗?),调用a的流操作符应该是可行的。实际上,操作符>>(f,a)在main()中起作用。但由于某些原因,它在转换为A的b上不起作用。我得到的错误是“调用‘operator>>(std::basic_istream>&,A)时没有匹配的函数” 我做错了什么 以下是示例代码: #include <stdlib.h> #include <fstream> #include <iostream> using namespace s
操作符>>(f,a)
在main()中起作用。但由于某些原因,它在转换为A的b上不起作用。我得到的错误是“调用‘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;
}
#包括
#包括
#包括
使用名称空间std;
模板
甲级
{
公众:
A(){A=-9;}
A(typetv){A=v;}
a型;
};
B类:公共A
{
公众:
B(intw):A(10){B=w;}
int b;
};
模板
istream&operator>>(istream&s,A&A)
{
cout(f,a);
B(1);
操作员>>(f、b);
返回退出成功;
}
.将演员阵容更改为:
operator>>(s, (A<int> &)b);
操作员>>(s,(A和)b);
您的原始强制转换将创建一个临时强制转换,您只能获得一个常量引用。将您的强制转换更改为:
operator>>(s, (A<int> &)b);
操作员>>(s,(A和)b);
您最初的强制转换创建了一个临时对象,您只能获得一个常量引用。问题在于,您的C-cast显然是在创建一个新对象,而不是按预期向上转换。由于此新对象是临时对象,因此无法将其绑定到父级运算符函数的非常量引用参数。如果将
static\u cast
转换为对父对象的引用,则该操作应有效:
操作符>>(s,静态_cast(b))代码>问题在于,您的C-cast显然是在创建一个新对象,而不是像预期的那样向上转换。由于此新对象是临时对象,因此无法将其绑定到父级运算符函数的非常量引用参数。如果将static\u cast
转换为对父对象的引用,则该操作应有效:
操作符>>(s,静态_cast(b))代码>您使用的是哪种编译器?我在visualstudio中尝试过这个,它工作得非常好。我不太清楚编译器。但是我在运行Ubuntu。你在使用哪个编译器?我在visualstudio中尝试过这个,它工作得非常好。我不太清楚编译器。但是我在运行Ubuntu。哇,它的工作方式很有魅力。你能解释一下吗?我对临时变量和常量引用一无所知。您最初的演员阵容通过切掉b的a
部分并复制它创建了一个新对象。它没有绑定到任何变量,因此它是临时的。它不是固有的常量,但您只能获取对它的常量引用,因此您的istream&operator>>(istream&s,A&A)
无法将A&
与常量&
匹配,谢谢。我刚从Matlab转换过来,所以这些概念对我来说很难掌握。但我想我能理解你的意思。每天学习新东西。:-)哇,很有魅力。你能解释一下吗?我对临时变量和常量引用一无所知。您最初的演员阵容通过切掉b的a
部分并复制它创建了一个新对象。它没有绑定到任何变量,因此它是临时的。它不是固有的常量,但您只能获取对它的常量引用,因此您的istream&operator>>(istream&s,A&A)
无法将A&
与常量&
匹配,谢谢。我刚从Matlab转换过来,所以这些概念对我来说很难掌握。但我想我能理解你的意思。每天学习新东西。:-)