C++ – Verklaring kan adres niet oplossen voor overbelaste functie

Wanneer ik het volgende typen als een stand-alone regel:

std::endl;

Ik heb de volgende foutmelding:

statement cannot resolve address for overloaded function

Waarom is dat? Kan ik niet schrijven std::endl;als een stand-alone lijn?

bedankt.


Antwoord 1, Autoriteit 100%

std::endlis een functiesjabloon. Normaal gesproken wordt het gebruikt als een argument voor de Insertion-operator <<. In dat geval wordt de operator<<van de betreffende stroom gedefinieerd als b.v. ostream& operator<< ( ostream& (*f)( ostream& ) ). Het type van het argument van fis gedefinieerd, dus de compiler zal dan de exacte overbelasting van de functie kennen.

Het is vergelijkbaar met dit:

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

Maar u kunt de dubbelzinnigheid oplichten door enkele typepunten:

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 

Dat is wat er normaal gebeurt met std::endlwanneer u wordt geleverd als een argument voor operator<<: Er is een definitie van de functie

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

En dit stelt de compiler in staat om de juiste overbelasting van std::endlte kiezen wanneer geleverd aan b.v. std::cout << std::endl;.

Leuke vraag!


Antwoord 2, autoriteit 20%

De meest waarschijnlijkereden die ik kan bedenken is dat de verklaring is:

ostream& endl ( ostream& os );

Met andere woorden, zonder deel uit te maken van een <<bewerking, is er geen osdie kan worden afgeleid. Ik ben er vrij zeker van dat dit het geval is sinds de regel:

std::endl (std::cout);

compileert prima.

Mijn vraag aan jou is: waarom zou je dit willendoen?

Ik weet zeker dat 7;een volkomen geldige verklaring is in C, maar je ziet niet dat dat soort onzin mijn code vervuilt 🙂


Antwoord 3, autoriteit 20%

std::endlis een functiesjabloon. Als je het gebruikt in een context waarin het sjabloonargument niet uniek kan worden bepaald, moet je ondubbelzinnig maken welke specialisatie je bedoelt. U kunt bijvoorbeeld een expliciete cast gebruiken of deze toewijzen aan een variabele van het juiste type.

bijv.

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

Meestal gebruik je het gewoon in een context waarin het sjabloonargument automatisch wordt afgeleid.

#include <iostream>
#include <ostream>
int main()
{
    std::cout << std::endl;
    std::endl( std::cout );
}

Antwoord 4, autoriteit 20%

std::endl is een manipulator. Het is eigenlijk een functie die wordt aangeroepen door de a-versie van de << operator op een stream.

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

Antwoord 5, autoriteit 15%

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

Je kunt std::endlniet alleen hebben, omdat het een basic_ostreamvereist als een type parameter. Het is de manier waarop het is gedefinieerd.

Het is alsof je my_func()probeert aan te roepen wanneer de functie is gedefinieerd als void my_func(int n)


Antwoord 6, autoriteit 10%

endl is een functie waaraan een parameter moet doorgegeven worden. Zie std::endl op cplusplus.com

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

Antwoord 7, autoriteit 5%

De std::endlbeëindigt een regel en spoelt de buffer leeg. Het moet dus op de stream worden aangesloten zoals coutof iets dergelijks.


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

Other episodes