C++ 铿锵++;模板化类中模板化方法专门化的自动返回类型错误?
为了理解,我简化了示例,获得了以下代码C++ 铿锵++;模板化类中模板化方法专门化的自动返回类型错误?,c++,templates,c++14,clang++,auto,C++,Templates,C++14,Clang++,Auto,为了理解,我简化了示例,获得了以下代码 template <bool> struct foo { template <typename T> auto bar (int i) { return i; } }; template <> template <typename T> auto foo<true>::bar (int i) { return i; } int main()
template <bool>
struct foo
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
template <typename T>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
我的问题很明显:谁是对的
g++还是铿锵++
我认为g++是正确的,这是来自clangg++的bug,但我要求确认
p、 s:对不起,我的英语不好。我也有同样的问题,这是答案。 除此之外,您还应该考虑到隐式自动返回类型仅在C++14之后才被允许,因此您应该使用
-std=C++14
编译标志,或者显式设置返回类型(对于C++11)
问题是,CLang与template类的模板函数的专门化不匹配。要克服此问题,您应该有一个空的模板类声明和单独的专门化:
template <bool>
struct foo;
template <>
struct foo <false>
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
struct foo <true>
{
template <typename T>
auto bar (int i)
{ return i; }
};
int main()
{
return 0;
}
模板
结构foo;
模板
结构foo
{
模板
自动栏(int i)
{返回i;}
};
模板
结构foo
{
模板
自动栏(int i)
{返回i;}
};
int main()
{
返回0;
}
试试gcc 6.1和clang 3.8。这是一个clang问题。它适用于3.8:感谢您的努力,但您指向“解决方案”的链接与我在问题中引用的“另一个问题”的链接相同。而被接受的“解决方案”就是我对这个问题的回答。而且,很明显,说到C++14,非C++11,如何标记(没有C++11标记)。我的问题不是“如何解决?”而是“谁是对的?”。你是说(如果我理解正确的话)“g++是对的,而clang++是错的”。但我希望在回答中引用官方标准的相关部分。(再次为我糟糕的英语道歉)嗨@max66,很抱歉我没有立刻认出你,你是第一个提供解决方案的人。对我来说,毫无疑问“谁是对的”:标准允许模板声明,这也是定义,它允许模板专门化。所以,很明显,当模板类声明也是它的定义时,CLang只是缺少对模板类进行专门化的模板函数定义。这不是一个CLand bug,只是还没有实现特性,因为CLang还很年轻,并且CLang 3.8.1兼容GCC4.2.1(这是一个非常旧的版本)。
template <bool>
struct foo
{
auto bar (int i)
{ return i; }
};
template <>
auto foo<true>::bar (int i)
{ return i; }
int main()
{
return 0;
}
template <bool>
struct foo;
template <>
struct foo <false>
{
template <typename T>
auto bar (int i)
{ return i; }
};
template <>
struct foo <true>
{
template <typename T>
auto bar (int i)
{ return i; }
};
int main()
{
return 0;
}