1. ホーム
  2. c++

[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。

2022-01-26 16:18:14

質問

以下を単独で入力した場合。

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; .

いい質問ですねー。