Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 铿锵++;模板化类中模板化方法专门化的自动返回类型错误?_C++_Templates_C++14_Clang++_Auto - Fatal编程技术网

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;
}