我試圖弄清楚如何解決基類中函式名稱的歧義問題。
#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()
uj5u.com熱心網友回復:
如果您希望從多個基類中考慮同名的成員函式(模板),您需要將它們顯式匯入派生類范圍:
class Y : public BaseA<Y, Z>, public BaseB
{
public:
/*...*/
using BaseA::parent;
using BaseB::parent;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/519918.html
標籤:C 模板模糊的
