我正在为一个学校项目做一个分数班,我的大脑正在煎炸 . 有人告诉我通过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 回答
听起来你试图宣布
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
来减少你的设计 .只需取消const ...它们不是成员函数,所以它们不能是const . 你也应该通过引用传递类对象......没有必要一直复制副本 .
我无法弄清楚你的第一个新错误,但
operator==
和operator<
错误是因为默认情况下它们在你的类中是private
. 你需要一条public:
线,这样他们才能进入外面的世界 .它引用的修饰符是函数末尾的const,在参数之后:
const修饰符指示该函数不会修改它所属的对象 . 由于它们不是成员函数,因此它们不属于任何对象 .
函数声明后面的
const
关键字仅允许用于成员函数:这是不允许的,因为成员函数声明结尾处的
const
表示此成员函数不会修改*this
对象的非mutable
值 . 由于这是一个非成员函数,因此应用于函数声明末尾的const
是一个错误 .此外,如果您将
<
运算符(或其他运算符,如>
,+
,-
等)定义为class,它只能接受一个参数:虽然正如Potatoswatter指出的那样,你应该在课堂外定义这些类型的运算符作为自由函数 .