#c
#c
Вопрос:
Прямо сейчас я читаю курс C coursera, пытаясь скомпилировать пример отсюда: Ira Pohl’s C путем разбиения как на g , так и на компиляторах intel c .
получены некоторые ошибки с обоими компиляторами, подобные этой, при каждом вызове большего:
rational.cpp(69): error: "greater" is ambiguous
<< greater(i, j);
^
/***************************************************************
* C by Dissection By Ira Pohl Addison Wesley
* Chapter 5 Ctors, Dtors, Conversion, and Operator Overloading
* Compiled with Borland C Builder Version 5.0 Summer 2001
******************************************************************/
//Overloading functions
#include <iostream>
using namespace std;
// Overloading functions
class rational {
public:
rational(int n = 0) : a(n), q(1) { }
rational(int i, int j) : a(i), q(j) { }
rational(double r) : a(static_cast<long>
(r * BIG)), q(BIG) { }
void print() const { cout << a << " / " << q; }
operator double()
{ return static_cast<double>(a) / q; }
friend ostreamamp; operator<<(ostreamamp; out, const rationalamp; x);
friend istreamamp; operator>>(istreamamp; in, rationalamp; x);
friend bool operator>(rational w, rational z);
private:
long a, q;
enum { BIG = 100 };
};
ostreamamp; operator<<(ostreamamp; out, const rationalamp; x)
{
return (out << x.a << " / " << x.q << 't');
}
istreamamp; operator>>(istreamamp; in, rationalamp; x)
{
return (in >> x.a >> x.q);
}
bool operator>(rational w, rational z)
{
return (static_cast<double>(w.a) / w.q > static_cast<double>(z.a) / z.q);
}
inline int greater(int i, int j)
{ return (i > j ? i : j); }
inline double greater(double x, double y)
{ return (x > y ? x : y); }
inline rational greater(rational w, rational z)
{ return (w > z ? w : z); }
int main()
{
int i = 10, j = 5;
float x = 7.0;
double y = 14.5;
rational w(10), z(3.5), zmax;
cout << "ngreater(" << i << ", " << j << ") = "
<< greater(i, j);
cout << "ngreater(" << x << ", " << y << ") = "
<< greater(x, y);
cout << "ngreater(" << i << ", ";
z.print();
cout << ") = "
<< greater(static_cast<rational>(i), z);
zmax = greater(w, z);
cout << "ngreater(";
w.print();
cout << ", ";
z.print();
cout << ") = ";
zmax.print();
cout << endl;
}
Ответ №1:
greater
Функция присутствует в импортированном std
пространстве имен, а также в исходном файле, поэтому компилятор не может решить, какую из них следует использовать.
Возможно, в Borland C 5.0 этого не было, поэтому код тогда компилировался нормально. Это хороший пример того, почему using namespace std
обычно это плохая идея.
Вы можете попытаться удалить это объявление и вручную добавить явный std::
префикс, где это необходимо (компилятор подскажет вам).
Комментарии:
1. Вы имеете в виду, что в
std::greater()
библиотеке естьiostream
функция? Потому что я не могу найти это в документах.2.
greater
кажется, существует толькоfunctional
, если я чего-то не упускаю.3. Согласно приведенной ссылке —
Defined in header <functional>
— в приведенной здесь операции это не включено.4. Я обновил ответ.
std::greater
Функция определена , по крайней мере, в<functional>
заголовке, но этот заголовок может быть включен<iostream>
неявно.5. @Carcigenicate Но нет ничего, запрещающего, чтобы один заголовок включал другой.