模板成员的clang递归类型派生错误

时间:2015-03-16 13:49:47

标签: templates c++11 recursion instantiation clang++

此代码通常使用gcc 4.8及更高版本编译,但不是clang++ 3.5及更高编译。而是I have an error

!!error: no viable conversion from 'Data<Data<double, double>, Data<double, double>>' to 'Data<double, double>'

这意味着只生成了func(Data<double,double>)的实例。

为什么忽略嵌套结构?

这是Clang的错误吗?或者gcc远离标准?

template<class T1,class T2>
struct Data{
    T1 t1;    T2 t2;
    Data(T1 t1,T2 t2):t1(t1),t2(t2){}
};
template<class T1,class T2>
Data<T1,T2> make_Data(T1 t1,T2 t2){return Data<T1,T2>(t1,t2);}

struct Foo{
    template<class T> static
    double func(const T& t){return 0.1*t;}

    template<class T1,class T2>static
    auto func(const Data<T1,T2>& d)
      ->decltype(make_Data(func(d.t1),func(d.t2)))
    {return make_Data(func(d.t1),func(d.t2));}
};
template<class T>
auto apply_func(const T& t) 
  ->decltype(Foo::func(t))
{return Foo::func(t);}


int main() {
auto data=make_Data(make_Data(1,2),make_Data(3,4));
auto data1=apply_func(data);

return 0;
}

作为workaround,我必须制作struct Foo模板

template<class T>
struct Foo{        
    static double func(const T& t){return 0.1*t;}
};
template<class T>
auto apply_func(const  T& t)
  ->decltype(Foo<T>::func(t))
{return Foo<T>::func(t);}

template<class T1,class T2>
struct Foo<Data<T1,T2>>{
static auto func(const Data<T1,T2>& d)
      ->decltype(make_Data(apply_func(d.t1),apply_func(d.t2)))
    {return make_Data(apply_func(d.t1),apply_func(d.t2));}

};

但是,案例函数apply_func应该在实现中使用,并在类特化之前声明。

0 个答案:

没有答案