22

スタンドアロン行として次のように入力すると、次のようになります。

std::endl;

次のエラーが発生しました:

statement cannot resolve address for overloaded function

何故ですか?std::endl;スタンドアロン行として書くことはできませんか?

ありがとう。

4

8 に答える 8

20

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;

いい質問です!

于 2011-01-30T12:50:32.513 に答える
4

std::endlはマニピュレータです。これは実際には、ストリーム上の<<演算子のバージョンによって呼び出される関数です。

std::cout << std::endl
// would call 
std::endl(std::cout).
于 2011-01-30T12:43:24.723 に答える
4

私が考えることができる最も可能性の高い理由は、それが宣言であるということです:

ostream& endl ( ostream& os );

言い換えれば、<<操作の一部でなくosても、推測できるものはありません。私はこれが次の行以来のケースであるとかなり確信しています:

std::endl (std::cout);

うまくコンパイルします。

あなたへの私の質問は:なぜあなたはこれをしたいのですか?

私はCで完全に有効なステートメントであるという事実を知って7;いますが、そのようなゴミが私のコードを汚染しているのを見ることはありません:-)

于 2011-01-30T12:38:18.087 に答える
4

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 );
}
于 2011-01-30T13:30:52.887 に答える
3

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

パラメータの一種としてをstd::endl必要とするため、単独で使用することはできません。basic_ostreamそれが定義されている方法です。

my_func()これは、関数が次のように定義されているときに呼び出そうとするようなものです。void my_func(int n)

于 2011-01-30T12:41:34.307 に答える
2

endlは、パラメーターを受け取る関数です。cplusplus.comのstd::endlを参照してください

// This works.
std::endl(std::cout);
于 2011-01-30T12:40:40.523 に答える
1

は行を終了し、std::endlバッファをフラッシュします。coutしたがって、ストリームのように、または同様に接続する必要があります。

于 2011-01-30T12:38:48.793 に答える
-1
#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");









                                   }    
于 2017-01-24T12:23:07.130 に答える