首页 文章

c分数类 . 超载运营商?

提问于
浏览
0

我正在为一个学校项目做一个分数班,我的大脑正在煎炸 . 有人告诉我通过friend关键字重载<<和>>运算符 . 但是我为此收到了错误 .

我在这里发布了相关代码:http://pastebin.com/NgCABGJ2

错误包括:错误C2270:'<<':非成员函数不允许使用修饰符(此错误适用于所有声明为朋友的错误)

这是在运营商<定义 . 错误C2333:'Fraction :: operator <':函数声明中的错误;跳过功能体

总共有46个......这是一场噩梦 .

编辑:

谢谢,我解决了几乎所有的错误,但仍然有3个

错误C2664:'Fraction :: Fraction(const Fraction&)':无法将参数1从'int'转换为'const Fraction&'在此语句中发生:

Fraction<int> test1, test2, test3(10);

错误C2248:'Fraction :: operator ==':无法访问类'Fraction'中声明的私有成员错误C2248:'Fraction :: operator <':无法访问类'Fraction'中声明的私有成员

我不明白这两个,但它发生在这些陈述:

if (test1 == test2)
    cout << "\nTest1 is equal to Test2";
if (test1 < test2)
    cout << "\nTest1 is less than Test2";

谢谢!

<> <> <>> EDIT2 <<> <> <>

我修复了其他私有访问错误,但现在我有一些重要的奇怪错误:

完整代码:http://pastebin.com/MVrB67SR

错误:

错误1错误LNK2001:未解析的外部符号“class Fraction __cdecl operator-(class Fraction const&,class Fraction const&)”(?? G @ YA?AV?$ Fraction @ H @@ ABV0 @ 0 @ Z)错误2错误LNK2001:未解析的外部符号“类Fraction __cdecl运算符(类Fraction const&,类Fraction const&)”(?? H @ YA?AV?$ Fraction @ H @@ ABV0 @ 0 @ Z)错误3错误LNK2001:未解析的外部符号“class Fraction __cdecl operator /(class Fraction const&,class Fraction const&)”(?? K @ YA?AV?$ Fraction @ H @@ ABV0 @ 0 @ Z)c:\ Users \ caleb jares \ documents \ visual studio 2010 \ Projects \ Solution11-5 \ Solution11-5 \ Solution11-5.obj错误4错误LNK2001:未解析的外部符号“class Fraction __cdecl operator *(class Fraction const&,class Fraction const&)”(?? D @ YA?AV?$ Fraction @ H @@ ABV0 @ 0 @ Z)错误5错误LNK2001:未解析的外部符号“class std :: basic_ostream>&__cdecl operator <<(class std :: basic_ostream> const&,class Fraction)” (?? 6 @ YAAAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@@ std @@ ABV01 @ V?$ Fraction @ H @@@ Z)Err或6错误LNK2001:未解析的外部符号“class std :: basic_istream>&__cdecl operator >>(class std :: basic_istream> const&,class Fraction)”(?? 5 @ YAAAV?$ basic_istream @ DU?$ char_traits @ D @std @@@ std @@ ABV01 @ V?$ Fraction @ H @@@ Z)错误7错误LNK1120:6个未解析的外部

再次,谢谢你的帮助!

5 回答

  • 1

    听起来你试图宣布 friend ostream &operator<<(…) const; . friend 的重要之处在于他们不是成员 . friend 函数存在于类的范围之外,即使它是在 class {} 块中定义的 . 换句话说,您正在声明函数 ::operator<<() ,而不是 fraction::operator<<() . 并且只有成员函数可以具有尾随 const ,因为它修改了 this 的类型 .

    事实是, operator<< 对于输出通常不应该't be a friend anyway. It just gets the value and forwards it to the stream… that shouldn'吨需要任何特殊许可!同样适用于 operator< .

    完全取消类块外的功能 . 你的助产士没有办法使用 friend 来减少你的设计 .

  • 1

    只需取消const ...它们不是成员函数,所以它们不能是const . 你也应该通过引用传递类对象......没有必要一直复制副本 .

  • 0

    我无法弄清楚你的第一个新错误,但 operator==operator< 错误是因为默认情况下它们在你的类中是 private . 你需要一条 public: 线,这样他们才能进入外面的世界 .

  • 1

    它引用的修饰符是函数末尾的const,在参数之后:

    friend ostream& operator<<(const ostream& output, const Fraction<T> value) const; //<-- that
    friend istream& operator>>(const istream& input, Fraction<T> value) const; // <-- and that
    

    const修饰符指示该函数不会修改它所属的对象 . 由于它们不是成员函数,因此它们不属于任何对象 .

  • 0

    函数声明后面的 const 关键字仅允许用于成员函数:

    // This is not a member function!
    template <class T>
    ostream& operator<<(const ostream& output,
                        const Fraction<T>& value) /* No const! */
    {
        // ...
    }
    

    这是不允许的,因为成员函数声明结尾处的 const 表示此成员函数不会修改 *this 对象的非 mutable 值 . 由于这是一个非成员函数,因此应用于函数声明末尾的 const 是一个错误 .

    此外,如果您将 < 运算符(或其他运算符,如 >+- 等)定义为class,它只能接受一个参数:

    // Only accepts a single parameter (the "right-hand-side" argument)
    bool operator<(Fraction<T> const& right) const
    {
        // ...
    }
    

    虽然正如Potatoswatter指出的那样,你应该在课堂外定义这些类型的运算符作为自由函数 .

相关问题