我想根据给定的类型专门化一个模板结构,如下所示:
#include <iostream>
#include <array>
template<typename K>
struct Foo
{
static constexpr unsigned value = 1;
};
template<typename K, unsigned CC>
struct Foo<std::array<K,CC>>
{
static constexpr unsigned value = CC;
};
int main()
{
std::cout << Foo<float>::value << std::endl; // should give 1
std::cout << Foo<std::array<char,3>>::value << std::endl; // should give 3
}
然而,这会产生与clang和gcc不同的结果。我会说clang是正确的,而gcc是错误的。
输出gcc 4.8.2-19ubuntu1:
1
1
输出clang 3.4-1ubuntu3:
1
3
问题:
答案 0 :(得分:2)
std::array第二个模板参数为size_t
,而非无符号。
所以,如果你重写你的功能
template<typename K, std::size_t CC>
struct Foo<std::array<K,CC>>
{
static constexpr unsigned value = CC;
};
两个编制者应该给出相同的结果。
答案 1 :(得分:0)
这是clang中的已知错误:g++ and clang++ different behaviour with integral template parameter,http://llvm.org/bugs/show_bug.cgi?id=16279
17 - [...] []]模板参数类型应与模板参数的类型完全匹配,除了从数组绑定推导出的模板参数可以是任何整数类型。
正确的方法是使用std::size_t
作为Foo
的整数模板参数类型。