【发布时间】:2012-03-26 20:55:20
【问题描述】:
我的以下代码使用 g++ 4.4.6 可以正常工作,但无法使用 Visual Studio 2008 进行编译。它似乎与 Argument Dependent Lookup 有关,所以我认为 g++ 是正确的。
// 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:\work\testproject\testproject\testclass.cpp(6):错误 C2065:'foo':未声明的标识符
1>c:\work\testproject\testproject\testclass.cpp(6):错误 C2065:“输入”:未声明的标识符
1>c:\work\testproject\testproject\testclass.cpp(6) : error C2448: 'test::usesFoo::memberFunc' : function-style initializer 似乎是一个函数定义
我意识到要么将命名空间直接放在 cpp 文件中的成员函数上,要么“使用命名空间测试”将解决问题,我更好奇标准在这种情况下到底说了什么。
【问题讨论】:
-
我看不出有任何理由期望您的代码能够编译; foo 没有在 usesFoo 中定义。有趣的是它是用 g++ 编译的。
-
memberFunc不是静态的,foo是不合格的。 Argument 依赖查找意味着 function 的名称在参数的命名空间中查找,而不是相反。
标签: c++ visual-c++ g++