c++ 程序编译错误

查看:106
本文介绍了c++ 程序编译错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

程序功能如下:

在主函数中接受键盘输入的三个数据(用空格分隔),并且将最大的一个值输出到屏幕上(输出信息的前后都没有空白,输出信息的后面也没有回车换行)
从键盘输入的信息的类型可能有:
英文单词(不少于3个字母),相邻两个单词间用空格分隔
英文字母
整数
浮点数
分数,分子与分母以/分隔
程序运行时,仅接受一种类型的3个数据输入。然后输出其中最大者,结束程序运行

本地调试正常编译的,上传到oj却死活编译不通过……
看编译错误提示改了下也没办法。

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <functional>
#include <cmath>

using std::cin;
using std::cout;
using std::ios;
using std::string;
using std::stringstream;
using std::less;
using std::greater;

class fraction
{
public:
    template<typename streamType>
        friend streamType& operator>>(streamType& is, fraction& rhs);
    template<typename streamType>
        friend streamType& operator<<(streamType& os, fraction& rhs);
    fraction() = default;
    fraction(const fraction& rhs) = default;
    ~fraction() = default;
    fraction& operator=(const fraction& rhs)  = default;
    void set(int a, int b)
    {
        this->a_ = a;
        this->b_ = b;
    }
    bool operator<(const fraction& rhs) const { return fraction::compare(*this, rhs, less<int>()); };
    bool operator>(const fraction& rhs) const { return fraction::compare(*this, rhs, greater<int>()); };
    bool operator==(const fraction& rhs) const { return this->a_ == rhs.a_ && this->b_ == rhs.b_; };
    bool operator!=(const fraction& rhs) const { return !(*this == rhs); };
    template <typename compType>
    static bool compare(const fraction& lhs, const fraction& rhs, compType comp = less<int>())
    {
        if (lhs.b_ == rhs.b_)
        {
            return comp(lhs.a_, rhs.a_);
        }
        int lcm = fraction::lcm(lhs.b_, rhs.b_);
        int tmp1, tmp2;
        tmp1 = lhs.a_ * (lcm / lhs.b_);
        tmp2 = rhs.a_ * (lcm / rhs.b_);
        return comp(tmp1, tmp2);
    }
private:
    int a_, b_;

    template <typename Integer>
    static Integer gcd(Integer A, Integer B)
    {
        do
        {
            const Integer tmp(B);
            B = A % B;
            A = tmp;
        } while (B != 0);

        return A;
    }
    template <typename Integer>
    static Integer lcm(const Integer & A, const Integer & B)
    {
        Integer ret = A;
        ret /= gcd(A, B);
        ret *= B;
        return ret;
    }
};


template <typename streamType>
streamType& operator>>(streamType& is, fraction& rhs)
{
    int a, b;
    is >> a;
    if (!is.fail() && is.get() == '/')
    {
        is >> b;
        if (b<0)
        {
            b = -b;
            a = -a;
        }
        rhs.set(a, b);
    }
    else {
        is.setstate(ios::failbit);
    }
    return is;
}

template <typename streamType>
streamType& operator<<(streamType& os, fraction& rhs)
{
    return os << rhs.a_ << "/" << rhs.b_;
}

template<class T>
T max(const T& val1, const T& val2, const T& val3)
{
    const T * pmax = &val1;
    if (val2 > *pmax)
    {
        pmax = &val2;
    }
    if (val3 > *pmax)
    {
        pmax = &val3;
    }
    return *pmax;
}

template<class T>
bool tryType(const string& val1str, const string& val2str, const string& val3str) {
    T val1, val2, val3;
    stringstream ss;
    ss << val1str << " " << val2str << " " << val3str;
    ss >> val1 >> val2 >> val3;
    if (!ss.fail())
    {
        cout << std::setiosflags(ios::fixed) << std::setprecision(5) << max<T>(val1, val2, val3);
        return true;
    }
    return false;
}

int main()
{
    string val1, val2, val3;
    getline(cin, val1, ' ');
    getline(cin, val2, ' ');
    getline(cin, val3, '\n');
    tryType<int>(val1, val2, val3) ||
        tryType<double>(val1, val2, val3) ||
        tryType<fraction>(val1, val2, val3) ||
        tryType<string>(val1, val2, val3);
    return 0;
}

编译错误

a.cpp: In instantiation of 'bool tryType(const string&, const string&, const string&) [with T = fraction; std::string = std::basic_string<char>]':
a.cpp:139:43: required from here
a.cpp:125:9: error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
In file included from /usr/include/c++/4.7/iostream:40:0,
from a.cpp:1:
/usr/include/c++/4.7/ostream:600:5: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = fraction]'

解决方案

感谢felix提供的解答

streamType& operator<<(streamType& os, const fraction& rhs)

添加const即可

这篇关于c++ 程序编译错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆