【问题标题】:template class + operators + friends = unresolved externals模板类 + 运算符 + 朋友 = 未解决的外部
【发布时间】:2010-10-07 21:05:46
【问题描述】:

我有一个名为 fraction 的类,我将一些运算符声明为朋友。我事先声明了友元运算符,正如http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16 告诉我的那样,但它只修复了 +、-、* 和 /。 > 仍然不起作用。

template <class T> class Fraction;
template <class T> Fraction<T> operator+ (Fraction<T> const& left, Fraction<T> const& right);
template <class T> Fraction<T> operator- (Fraction<T> const& left, Fraction<T> const& right);
template <class T> Fraction<T> operator* (Fraction<T> const& left, Fraction<T> const& right);
template <class T> Fraction<T> operator/ (Fraction<T> const& left, Fraction<T> const& right);
template <class T> ostream& operator<< (const ostream& output, Fraction<T> const& value);
template <class T> istream& operator>> (const ostream& input, Fraction<T> const& value);

还有班级:

template <class T>
class Fraction
{
 ...

 friend Fraction<T> operator+ <>(const Fraction<T>& left, const Fraction<T>& right);
 friend Fraction<T> operator- <>(const Fraction<T>& left, const Fraction<T>& right);
 friend Fraction<T> operator* <>(const Fraction<T>& left, const Fraction<T>& right);
 friend Fraction<T> operator/ <>(const Fraction<T>& left, const Fraction<T>& right);

 friend ostream& operator<< <>(const ostream& output, const Fraction<T> value);
 friend istream& operator>> <>(const istream& input, Fraction<T> value);
}

template <class T> ostream& operator<< <>(const ostream& output, const Fraction<T>& value)
{
 output << value.Numerator << '/' << value.Denominator;

 return output;
}
template <class T> istream& operator>> <>(const istream& input, Fraction<T>& value)
{
 T n, d, char seperator;

 cin >> n >> seperator >> d;

 value.SetNumerator(n);
 value.SetDenominator(d);

 return input;
}

【问题讨论】:

    标签: c++ operator-overloading unresolved-external


    【解决方案1】:

    正如“dark_charlie”所说,但删除const

    我宁愿将其仅作为评论,但不幸的是,StackOverflow 尚未允许我发表评论(对于有评论冲动的人我不应该发表此评论:它针对 )。

    【讨论】:

    • +1 抱怨了这么多。希望其他人支持你,这样你就可以停止抱怨;)
    • 啊,好吧,我为此回答了一个“赏金”问题。希望(但这个问题太模糊了,我不知道我的回答是否涵盖了它)它能让我超过所需的 50 分。我发现 StackOverflow 的这个特殊方面完全令人费解,但也许它增加了一些类似游戏的维度——赚取积分?或者它可能是一个反垃圾邮件设备?不管怎样,谢谢! :-)
    【解决方案2】:

    替换

    template <class T> istream& operator>> <>(const istream& input, Fraction<T>& value)  { ...
    

    template <class T> istream& operator>> (const istream& input, Fraction<T>& value)  { ...
    

    对于另一个运算符也是如此。问题在于,这样您正在创建一个空白模板特化,它产生的符号与前向声明为朋友的符号不同。

    编辑:

    我看到的另一个问题是这个前向声明:

    template <class T> istream& operator>> (const ostream& input, Fraction<T> const& value);
    

    你将它的第一个参数声明为const ostream&amp;,它应该是const istream&amp;。这肯定会导致链接器错误。

    旁注:原始答案不应根据常见问题解答修复错误。但是,如果问题仍然存在,我会试一试。

    【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2016-08-27
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多