Подтвердить что ты не робот

С++ - инструкция не может разрешить адрес для перегруженной функции

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

std::endl;

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

statement cannot resolve address for overloaded function

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

Спасибо.

4b9b3361

Ответ 1

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;.

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

Ответ 2

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

ostream& endl ( ostream& os );

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

std::endl (std::cout);

просто отлично.

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

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

Ответ 3

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 );
}

Ответ 4

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

// This works.
std::endl(std::cout);

Ответ 5

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

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

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

Ответ 6

std:: endl - манипулятор. Это фактически функция, которая вызывается а-версией < оператора в потоке.

std::cout << std::endl
// would call 
std::endl(std::cout).

Ответ 7

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

Ответ 8

#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");









                                   }