提问人:Frank 提问时间:8/9/2023 最后编辑:DailyLearnerFrank 更新时间:8/9/2023 访问量:63
双重继承型扣减
Double inheritance type deduction
问:
我有以下模板类:
template<class T>
class Foo {
public:
void Bar(T* t) { member = t; }
private:
T* member;
};
这被(两次)用作不同类的基类:
class AwesomeClass : public Foo<ISomeInterface>, public Foo<IOtherInterface> {};
然后称为这样的东西:
class Caller {
void Init(ISomeInterface * i) {
AwesomeClass a;
a.Bar(i);
}
}
但是,这不会编译,说明对 Bar 的调用是模棱两可的。因此,我需要使用 ,因为显然编译器无法确定要调用哪个 Bar(甚至认为它被赋予了一个 ISomeInterface 对象)。有什么办法可以解决这个问题吗?a.Foo<ISomeInterface>::Bar(i)
另外,我想知道继承是否是这里的“正确”方法,或者组合是否是一个更好的选择。
答:
4赞
songyuanyao
8/9/2023
#1
您可以将 s 引入 ,然后两者都可以在重载解决的范围内找到。F.D.公司Bar
AwesomeClass
AwesomeClass
class AwesomeClass : public Foo<ISomeInterface>, public Foo<IOtherInterface> {
public:
using Foo<ISomeInterface>::Bar;
using Foo<IOtherInterface>::Bar;
};
评论
0赞
Frank
8/10/2023
这似乎有效,但我想知道为什么有必要。有没有这个就不能工作的好理由吗?我没有看到编译器有什么额外的信息。
1赞
HolyBlackCat
8/9/2023
#2
您需要好友函数和 ADL。这样,您就不需要从每个基地单独使用每个这样的方法。using
template <typename T>
class Foo
{
T *member = nullptr;
public:
friend void Bar(Foo &self, T *t)
{
self.member = t;
}
};
void Init(ISomeInterface * i)
{
AwesomeClass a;
Bar(a, i);
}
评论