C++ - لا يمكن لعبارة حل العنوان للوظيفة المحملة بشكل زائد
سؤال
عندما أكتب ما يلي كسطر مستقل:
std::endl;
حصلت على الخطأ التالي:
statement cannot resolve address for overloaded function
لماذا هذا؟لا أستطيع أن أكتب std::endl;
كخط مستقل؟
شكرًا.
المحلول
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;
.
سؤال جيد!
نصائح أخرى
أكثر محتمل السبب الذي يمكنني التفكير فيه هو أن إعلانه هو:
ostream& endl ( ostream& os );
بمعنى آخر، دون أن تكون جزءًا من أ <<
العملية، لا يوجد os
التي يمكن استنتاجها.أنا متأكد تمامًا من أن هذا هو الحال منذ السطر:
std::endl (std::cout);
يجمع على ما يرام.
سؤالي لك هو:لماذا سوف يريد لفعل هذا؟
أعرف ذلك حقيقةً 7;
عبارة صالحة تمامًا في لغة C ولكنك لا ترى هذا النوع من القمامة التي تلوث الكود الخاص بي :-)
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 );
}
http://www.cplusplus.com/reference/iostream/manipulators/endl/
لا يمكن أن يكون لديك std::endl
في حد ذاته لأنه يتطلب أ basic_ostream
كنوع من المعلمة.إنها الطريقة التي يتم تعريفها بها.
إنها مثل محاولة الاتصال my_func()
عندما يتم تعريف الوظيفة على أنها void my_func(int n)
endl هي دالة تأخذ معلمة.يرى std::endl على cplusplus.com
// This works.
std::endl(std::cout);
std::endl هو مناور.إنها في الواقع وظيفة يتم استدعاؤها بواسطة إصدار عامل التشغيل << الموجود في الدفق.
std::cout << std::endl
// would call
std::endl(std::cout).
ال std::endl
ينهي الخط ويمسح المخزن المؤقت.لذا يجب أن يكون متصلاً بالتيار مثل cout
أو مشابه.
#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");
}