2

ヘッダー ファイルの 1 つで " void f(int x) "という名前の関数を (c++、VS 2010 で) 宣言し、それをそれぞれの cpp ファイルに実装したとします。そのソース ファイルのみにオーバーロード関数 ( void f(int x, int y) )を追加しようとすると(ヘッダーに宣言がありません)、「function does not take 2 arguments」というエラーが表示されます。
(この関数は呼び出し関数の上に書かれています)。

ヘッダー ファイルには、実装されたコードはありません。

いくつかの C++ ルールに違反しましたか、それとも単に Visual を使用しているためですか? ヘッダー ファイルですべてのオーバーロード関数を宣言する必要がありますか (またはまったく宣言しませんか)。

編集: ソースファイル:

int findNodeRec(int data, NodeTree *root) 
{ 
    return 1;
}
int Tree::findNodeRec(int data) 
{ 
    return findNodeRec(data, m_root); 
} 
4

1 に答える 1

7

問題は、1 パラメーター バージョンがクラス メンバーとして定義されているのに対し、2 パラメーター バージョンはフリー関数であることです。コンパイラが呼び出す候補を見つけようとするとき、異なるスコープを混在させないため、クラス スコープのバージョンのみを確認し、パラメーターに基づいて最適なオーバーロードを選択しようとします。

代わりに呼び出すだけ::f(x, y)で、フリー関数のグローバル スコープが検索されます。フリー関数がヘッダーで宣言されているかどうかは問題ではないことに注意してください。コンパイラはまだそれを見つけることができませんでした。

于 2013-01-07T21:55:35.857 に答える