【发布时间】:2016-01-23 16:04:18
【问题描述】:
考虑代码:
template<typename T>
class Foo{};
namespace X
{
class X{};
}
using namespace X; // now both class X and namespace X are visible
Foo<X::X> f()
{
return {};
}
int main() {}
gcc5.2 编译代码没有任何错误。然而 clang 吐出错误:
错误:“X”不是类、命名空间或枚举 富 f()
错误:对“X”的引用不明确
根据 C++ 标准,代码在语法上是否有效?或者只是一个 gcc 错误?删除限定名称 X::X 并改用 Foo<X> 也会使 gcc 阻塞
错误:模板参数 1 无效 富 f()
【问题讨论】:
-
@Gread.And.Powerful.Oz 谢谢,但 2 个答案似乎相互矛盾。如果有人可以提供标准的报价,那就太好了。我的问题与我们都评论/回答的问题有关:stackoverflow.com/q/33313723/3093378
-
还有一个:stackoverflow.com/questions/1539333/…,也许谷歌搜索会有所帮助:google.com/…
-
@Gread.And.Powerful.Oz 谢谢,我以前见过一些,但我想看看根据标准的答案是什么,因为一个非常流行的编译器认为它是正确,而另一个不正确。这些答案都没有给出任何明确的答案。另一方面,gcc 认为代码是正确的。这就是为什么我也标记了language-lawyer。
-
我刚才有个想法,你试过 Foo<::x::x> 吗? (注意前面的双冒号)
标签: c++ c++11 gcc clang language-lawyer