2011-01-30 2 views
20

のためのアドレスを解決することはできません。なぜC++ - I型は、スタンドアローンの行として以下のときの文がオーバーロード機能

statement cannot resolve address for overloaded function

std::endl;

私は、次のエラーを得ましたそれ?スタンドアロンの回線としてstd::endl;を書き込むことはできませんか?

ありがとうございました。私は考えることができる

+4

? – dreamlax

答えて

16

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 

operator <<への引数として指定する場合std::endlで正常に何が起こるかです:あり機能の定義

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

これにより、コンパイラはstd::endlの正しいオーバーロードを選択できるようになります。 std::cout << std::endl;

ニース質問!

+1

'std :: endl'は単一の関数テンプレートであり、関数やオーバーロードされた関数のセットではありません。単なる関数の場合、 'std :: endl; 'というステートメントは(無意味な場合は)うまくいくでしょう。 –

+0

@Charles Bailey:それを修正しました。それは多くの推論を変更するだろうか?私はそうは思わない。あいまいさは、casuの 'operator <<'を使って解決されます。 – xtofl

+0

それは、もしあれば、推論をより適切にする。 –

3

最もそう理由はそれの宣言があるということである。言い換えれば

ostream& endl (ostream& os); 

<<操作の一部ではなくて、推測できるいかなるosはありません。私はかなりこれがライン以来のケースであることを確信しています:

std::endl (std::cout); 

ちょうど良いコンパイル。

あなたに私の質問があります:なぜあなたはがこれを行うにはしたいですか?

私は7;はCで完全に有効な文があるという事実を知っていますが、ゴミのようなものが回線を終端し、バッファをフラッシュ

+0

私は可読性を追求するためにその方法を作りました。これは改行がいくつかのステートメントの後に挿入されたことを示しています。しかし、それは私のやり方と同じように書くのは無効だと思われます。ありがとう – Simplicity

1

std::endl :-)私のコードを汚染表示されません。したがって、ストリームはcoutなどのように接続する必要があります。

2

endlは、パラメータをとる関数です。それは、パラメータの種類としてbasic_ostreamを必要とするため、あなたは自分自身でstd::endlを持つことができませんstd::endl on cplusplus.com

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

STDとして定義されている場合::てendlは、マニピュレータあるmy_func()を呼び出すしようとしているようなのです。実際には、ストリーム上の< <演算子のバージョンによって呼び出される関数です。

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

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









            }  
関連する問題