C++ C++;包装模板函数 我有一个模板类a和一个流操作符函数a,因此它是一个模板函数 我有一个从a继承的类B,为模板指定了一个类型,并添加了一些特定于B的内容 我正在B上编写一个流操作符,它执行特定于B的操作,然后返回到为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

因为B是a的一个子类(你这样称呼它吗?),调用a的流操作符应该是可行的。实际上,
操作符>>(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转换过来,所以这些概念对我来说很难掌握。但我想我能理解你的意思。每天学习新东西。:-)