Неоднозначная перегрузка функций в C

#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 Но нет ничего, запрещающего, чтобы один заголовок включал другой.