【发布时间】:2021-10-17 17:57:18
【问题描述】:
我遇到了一些代码 sn-ps,一个类可以通过其模板参数从另一个类继承。但是,我不明白为什么我需要在struct D 中有三个using 行。我尝试调用d 的say_hi() 函数,但它声明error: request for member ‘say_hi’ is ambiguous,如果我有三个using 行,错误就消失了。谁能告诉我为什么?
struct C1 {
void say_hi(int) { puts("int hi"); }
};
struct C2 {
void say_hi(char) { puts("char hi"); }
};
struct C3 {
void say_hi(double) { puts("double hi"); }
};
template<typename T, typename U, typename V>
struct D : T, U, V {
using T::say_hi;
using U::say_hi;
using V::say_hi;
};
D<C1, C2, C3> d;
【问题讨论】:
-
您可以在没有
usings 的情况下手动指定使用哪个 BTW:d.C1::say_hi(1)将调用say_hi(int)。我不确定usings 是如何清除存在的歧义的,但这可能与那个有关。 -
执行
using T::say_hi;、using U::say_hi;和using V::say_hi;会将say_hi的重载从C1、C2和C3带入D。没有它们,编译器将无法判断您指的是d.C1::say_hi、d.C2::say_hi还是d.C3::say_hi。
标签: c++ templates inheritance template-inheritance