如何解决模板基类模板方法中的歧义



我正试图找出如何解决基类中函数名的歧义问题。

#include <type_traits>
template <typename T, typename PARENT>
class BaseA 
{
public:
BaseA(PARENT& p) : _parent(p) {}

public:
template <typename P_ = PARENT>
auto& parent() {
if constexpr (std::is_same_v<P_, PARENT>) {
return _parent;
} else {
return _parent.template parent<P_>();
}
}

private:
PARENT& _parent;
};
class AbstractBaseB {

};
class BaseB : public AbstractBaseB
{
public:
AbstractBaseB* parent() { return _parent; }

private:
AbstractBaseB* _parent;
};
class Z {
public:

void foo() {}
};
class Y : public BaseA<Y, Z>, public BaseB
{
public:
Y(Z& z) : BaseA(z) {

}

void foo() {}
};
class X : public BaseA<X, Y>, public BaseB
{
public:
X(Y& y) : BaseA(y) {
//This will compile
BaseA::parent().foo();
//This will NOT compile
BaseA::parent<Z>().foo();
}
};
int main()
{
Z z;
Y y(z);
X x(y);
}

这是一个非常具体/奇怪的用例,所以我在这里有一个工作示例:

https://cppinsights.io/s/08afbad9

要编译它,只需注释掉第58行。启用58后,这就是我得到第16行引起的模糊性的地方:

return _parent.template parent<P_>();

由于_parent的类型与BaseA模板的实例不同,所以我不能只做:

return _parent.template BaseA::parent<P_>();

就像我在57号线上做的那样。

我该怎么解决这个问题?

对于那些询问的人来说,模板化parent方法的目的是获得";第N";嵌套父级,而不必执行类似parent().parent().parent()的操作

如果您希望从多个基类中考虑相同名称的成员函数(模板(,则需要将它们显式导入派生类范围:

class Y : public BaseA<Y, Z>, public BaseB
{
public:
/*...*/
using BaseA::parent;
using BaseB::parent;
};

相关内容

  • 没有找到相关文章

最新更新