C++ 模板类中包含模板类的模板参数推断
我在另一个模板类中有一个模板类。如何编写一个模板函数来接受内部/外部模板类的任意组合C++ 模板类中包含模板类的模板参数推断,c++,templates,C++,Templates,我在另一个模板类中有一个模板类。如何编写一个模板函数来接受内部/外部模板类的任意组合 template <class X> struct A { template <class Y> struct B { int q; }; }; template <class X, class Y> int f( typename A<X>::template B<Y>& ab ) { return ab.q;
template <class X>
struct A
{
template <class Y>
struct B
{
int q;
};
};
template <class X, class Y>
int f( typename A<X>::template B<Y>& ab )
{
return ab.q;
}
int g( A<char>::B<short>& ab )
{
return f( ab ); // Error: Could not deduce template argument
}
模板
结构A
{
模板
结构B
{
int-q;
};
};
模板
int f(类型名A::模板B和ab)
{
返回ab.q;
}
INTG(A::B&ab)
{
返回f(ab);//错误:无法推断模板参数
}
此模板接受内部和外部的任意组合:
tempalte <typename T>
int f(T& ab)
{
return ab.q;
}
现在
A::B
和A::B
指的是相同的类型。给定一个或另一个,无法明确推断X
编译器不允许在此上下文中推断模板参数,因此为了传输类型信息,必须使其显式。
一种可能是提供别名:
模板
结构A
{
模板
结构B
{
使用X_type=X;
使用Y_type=Y;
int-q;
};
};
模板
内部财务(T&ab)
{
返回ab.q;
}
INTG(A::B&ab)
{
返回f(ab);
}
这样,您仍然可以访问类型,例如
typename T::X_type
我的问题是,对于一般情况,我已经有了模板int f(T&)
。当T
是A::B
时,我需要另一个f()
重载。我必须尝试使用std::enable_,如果。@Barnett可能会打开另一个有更多上下文的问题。@最大的_prime_是_463035818,例如,如果我已经有一个函数template int f(T&T){return sizeof(T);}
,但现在我需要另一个f()
这将返回A::B::q
@Barnett是的,我想我理解这个问题,我想我知道一个解决方案,尽管这不是问题所在,评论也不是谈论冗长代码的地方(任何比你写的稍长的东西在评论中都不可读/不可理解)@maxest_prime_是_463035818,别担心,我用@Jodocus建议的template int f(t&)
获得了它。
template <>
struct A<double>
{
template <class Y>
using B = A<int>::B<Y>;
};