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 - Fatal编程技术网

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