C ++ - оператор не может разрешить адрес для перегруженной функции - PullRequest
20 голосов
/ 30 января 2011

Когда я набираю следующее как отдельную строку:

std::endl;

Я получил следующую ошибку:

statement cannot resolve address for overloaded function

Почему это? Не могу ли я написать std::endl; как отдельную строку?

Спасибо.

Ответы [ 8 ]

16 голосов
/ 30 января 2011

std::endl - это шаблон функции. Обычно он используется в качестве аргумента оператора вставки <<. В этом случае operator<< рассматриваемого потока будет определяться как, например, ostream& operator<< ( ostream& (*f)( ostream& ) ). Тип аргумента f определен, поэтому компилятор будет знать точную перегрузку функции.

Это сравнимо с этим:

void f( int ){}
void f( double ) {}
void g( int ) {}
template<typename T> void ft(T){}

int main(){
  f; // ambiguous
  g; // unambiguous
  ft; // function template of unknown type...
}

Но вы можете устранить неоднозначность с помощью некоторых подсказок:

void takes_f_int( void (*f)(int) ){}

takes_f_int( f ); // will resolve to f(int) because of `takes_f_int` signature
(void (*)(int)) f; // selects the right f explicitly 
(void (*)(int)) ft; // selects the right ft explicitly 

Это то, что обычно происходит с std::endl при предоставлении в качестве аргумента operator <<: есть определение функции

 typedef (ostream& (*f)( ostream& ) ostream_function;
 ostream& operator<<( ostream&, ostream_function )

И это позволит компилятору выбрать правильную перегрузку std::endl, если она поступит, например, в. std::cout << std::endl;.

Хороший вопрос!

3 голосов
/ 30 января 2011

std::endl - это шаблон функции. Если вы используете его в контексте, где аргумент шаблона не может быть определен однозначно, вы должны четко определить, какую специализацию вы имеете в виду. Например, вы можете использовать явное приведение или назначить его переменной правильного типа.

, например

#include <ostream>

int main()
{
    // This statement has no effect:
    static_cast<std::ostream&(*)(std::ostream&)>( std::endl );

    std::ostream&(*fp)(std::ostream&) = std::endl;
}

Обычно вы просто используете его в контексте, где аргумент шаблона выводится автоматически.

#include <iostream>
#include <ostream>
int main()
{
    std::cout << std::endl;
    std::endl( std::cout );
}
3 голосов
/ 30 января 2011

Наиболее вероятная причина, по которой я могу думать, заключается в том, что это объявление:

ostream& endl ( ostream& os );

Другими словами, не будучи частью операции <<, os не может быть выведено. Я почти уверен, что это так, поскольку строка:

std::endl (std::cout);

компилируется просто отлично.

Мой вопрос к вам: с чего бы вам хотеть сделать это?

Я точно знаю, что 7; - совершенно правильное утверждение в C, но вы не видите такого рода мусора, загрязняющего мой код: -)

2 голосов
/ 30 января 2011

std :: endl - манипулятор.На самом деле это функция, которая вызывается версией оператора << в потоке. </p>

std::cout << std::endl
// would call 
std::endl(std::cout).
2 голосов
/ 30 января 2011

http://www.cplusplus.com/reference/iostream/manipulators/endl/

Вы не можете иметь std::endl само по себе, потому что для него требуется basic_ostream в качестве параметра.Это так, как это определено.

Это все равно что пытаться вызвать my_func(), когда функция определена как void my_func(int n)

2 голосов
/ 30 января 2011

endl - это функция, которая принимает параметр.См. std :: endl на cplusplus.com

// This works.
std::endl(std::cout);
1 голос
/ 30 января 2011

std::endl завершает строку и очищает буфер. Поэтому к нему должен быть подключен поток, подобный cout или подобному.

0 голосов
/ 24 января 2017
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
class student{

      private: 
           string coursecode;
           int number,total;
      public:
           void getcourse(void);
           void getnumber(void);
           void show(void);
      };

        void  student ::getcourse(){

              cout<<"pleas enter the course code\n";
              cin>>coursecode;

              }


        void  student::getnumber(){

                     cout<<"pleas enter the number \n";
                     cin>>number;

                     }
                void  student::show(){

                             cout<<"coursecode is\t\t"<<coursecode<<"\t\t and number is "<<number<<"\n";

                             } 
                             int main()
                             {

                                   student s;

                                  s.getcourse();
                                   s.getnumber(); 
                                   s.show();
                                   system("pause");









                                   }    
...