Недавно в моей компании мы столкнулись с ошибкой, что мне трудно понять, почему это на самом деле ошибка. Нам кажется, что это должно скомпилировать просто отлично и позволить нам явно создать шаблон типа bar:: foo.
mainy.cxx
int foo(int);
namespace bar {
template <typename T> T foo(T a, T){return a;}
}
namespace bar {
using ::foo;
}
template int bar::foo(int, int);
int main(){
return 0;
}
g++ ошибка
[[email protected]:~/test]1047 $ g++ mainy.cxx
mainy.cxx:10: error: 'int bar::foo(int, int)' should have been declared inside 'bar'
mainy.cxx:10: error: 'int bar::foo(int, int)' is not declared in '::'
Мы подтвердили, что это ошибка в gcc 4.8, 4.4 и clang 3.7, однако она работает с Visual Studio 2015.
Мы столкнулись с этой проблемой, когда пытались создать экземпляр std::remove
, но <<23 > , включенный до <cstdio>
и <cstdio>
, содержал в нем
namespace std {
using ::remove;
}
Любые идеи о том, что здесь происходит?