【发布时间】:2015-01-21 15:39:48
【问题描述】:
我想专门化一个函数模板。该函数在命名空间中声明:
namespace foo
{
template <int>
void function();
}
(为简单起见,模板基于int,而在我的生产代码中,它是enum class,但这是同一个问题。基于类型的模板也是如此)
现在我想将它专门用于特定值:
template <>
void foo::function<0>()
{
}
这无法使用g++ -std=c++11(版本 4.6、4.7、4.8 和 4.9)编译:
'template void foo::function()' 在不同命名空间中的特化 [-fpermissive]
clang++ -std=c++11 接受此代码。
g++ 也接受以下部分:
namespace foo
{
template <>
void function<0>()
{
}
}
谁是对的,gcc 还是 clang?
【问题讨论】:
-
两者都是正确的。唯一的区别是 clang 有一个扩展允许这种非标准声明。
-
@Ethouris 这与 Barrys 的回答相矛盾。想指出他哪里错了吗?
-
不,它没有,尽管您可能误解了我的回答。我说两个编译器都是对的,因为他们都说这段代码不符合标准 C++。唯一的区别是clang允许这个仍然非标准代码,但将其视为使用非标准扩展。
-
这是我对标准那部分的理解,但我绝不是这件事的权威。我只是一个在网上回答问题的人:-)
-
@Barry 当然,毫无疑问。但Ethouris 说的是另一回事。所以我想鼓励他用事实(比如引用标准)来支持他的陈述。你们中的一个(甚至两个)都错了,所以我很想知道是谁;-)
标签: c++ templates c++11 g++ clang++