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::endl
is 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 f
is 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::endl
wanneer 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::endl
te 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 os
die 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::endl
is 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::endl
niet alleen hebben, omdat het een basic_ostream
vereist 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::endl
beëindigt een regel en spoelt de buffer leeg. Het moet dus op de stream worden aangesloten zoals cout
of 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");
}