手动实例化模板时出错

时间:2017-04-04 20:57:48

标签: c++ visual-studio gcc clang

最近在我的公司遇到了一个错误,我无法理解为什么它实际上是一个错误。对我们来说,似乎这应该编译得很好,并允许我们显式实例化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 ++错误

[csteifel@host:~/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但在<algorithm>之前包含<cstdio>并且<cstdio>包含namespace std { using ::remove; } 时,我们遇到了此问题

jQuery('[class="autocompleteitem"]')

关于最新情况的任何想法?

1 个答案:

答案 0 :(得分:4)

看起来这与an ancient bug in gcc相关,您无法使用ns::func显式实例化模板,唯一的方法是使用namespace ns { ... func; }。这只是最近修复的newer gcc your code will compile

顺便说一下,与你所说的相反,你的代码是compiles with clang 3.7