Ошибка при создании экземпляра шаблона вручную

Недавно в моей компании мы столкнулись с ошибкой, что мне трудно понять, почему это на самом деле ошибка. Нам кажется, что это должно скомпилировать просто отлично и позволить нам явно создать шаблон типа 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;
}

Любые идеи о том, что здесь происходит?

Ответ 1

Похоже, что это связано с древней ошибкой в ​​gcc, где вы не можете явно создать шаблон с помощью ns::func, единственного путь должен был сделать это с помощью namespace ns { ... func; }. Это было недавно исправлено и с новый gcc ваш код будет компилироваться.

И, кстати, вопреки тому, что вы говорите, ваш код компилируется с clang 3.7.