clang ++自动返回类型错误,用于模板化类中模板化方法的特化?

时间:2016-06-27 19:42:16

标签: c++ templates c++14 clang++ auto

尝试理解another question,我已经简化了获取以下代码的示例。

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 ++ 4.9.2编译没有问题; clang ++ 3.5给出以下错误

tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not
      match any declaration in 'foo<true>'
   auto foo<true>::bar (int i)
                   ^~~

auto替换两个int返回值中的一个,没有变化:g ++ compile和clang ++给出了错误。将auto替换为int,错误消失。

template <typename T>部分非常重要,因为以下代码编译时两个编译器都没有问题

template <bool>
struct foo
 {
      auto bar (int i)
       { return i; }
 };

template <>
   auto foo<true>::bar (int i)
    { return i; }

int main()
 {
   return 0;
 }

我的问题很明显:谁对吗?

g ++或clang ++?

我认为g ++是正确的,这是来自clang ++的错误,但我要求确认。

p.s:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,这是solution。 除了你还应该考虑到自C ++ 14以来只允许隐式自动返回类型,所以你应该使用-std=c++14编译标志,或者显式设置返回类型(对于C ++ 11)。

问题是CLang与模板类的模板函数的特殊性不匹配。要解决这个问题,你应该有一个模板类的空声明和单独的特化:

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