У меня есть следующий код, который отлично работает с использованием 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): ошибка C2448: 'test :: usedFoo :: memberFunc': инициализатор стиля функции выглядит как определение функции
Я понимаю, что решение проблемы может заключаться в том, чтобы либо поместить пространство имен непосредственно в функцию-член в файле cpp, либо "использовать тест пространства имен", - мне более любопытно, что именно говорит стандарт в этом случае.