此代码通常使用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
应该在实现中使用,并在类特化之前声明。