C++ - لا يمكن لعبارة حل العنوان للوظيفة المحملة بشكل زائد

StackOverflow https://stackoverflow.com/questions/4842901

  •  27-10-2019
  •  | 
  •  

سؤال

عندما أكتب ما يلي كسطر مستقل:

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









                                   }    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top