程序功能如下:
在主函数中接受键盘输入的三个数据(用空格分隔),并且将最大的一个值输出到屏幕上(输出信息的前后都没有空白,输出信息的后面也没有回车换行)
从键盘输入的信息的类型可能有:
英文单词(不少于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提供的解答
添加const即可