g ++ 4.4.6を使用してうまく動作するが、Visual Studio 2008を使用してコンパイルできない以下のコードがあります。引数依存ルックアップと関連しているようですので、g ++が正しいと思います。コンパイルusingディレクティブはC++の関数引数にどのように影響しますか?
// testClass.hpp
namespace test {
class foo {
public:
foo(){}
};
class usesFoo {
public:
usesFoo() {}
void memberFunc(foo &input);
};
}
// testClass.cpp
#include "testClass.hpp"
using test::usesFoo;
void usesFoo::memberFunc(foo &input) {
(void) input;
}
のVisual Studioにされたコンパイルするとき、私は取得エラー、
1> ...
1> testClass.cpp 1> C:\作業\ testproject \ testproject \ testclass.cpp C2065: '入力':宣言されていない識別子 1> c:\ work \ testproject(6):エラーC2065: 'foo':宣言されていない識別子 1> c:\ work \ testproject \ testproject \ testclass.cpp \ testproject \ testclass.cpp(6):エラーC2448: 'test :: usesFoo :: memberFunc':関数スタイルの初期化子が関数定義のように見える
私は、cppファイルのメンバ関数に名前空間を直接置くか、 "namespace testを使う"のどちらかが問題を解決するかどうかを知っています。
あなたのコードがコンパイルされることを期待する理由はありません。 fooはusesFooで定義されていません。それはg ++でコンパイルされて興味深いです。 –
'memberFunc'は静的ではなく、' foo'は修飾されていません。 *引数*依存ルックアップは、*関数*の名前が引数の名前空間内で検索されることを意味し、他の方法では検索されません。 –
+1のコメント –