在函数重载中使用标记

Using tags in function overloading

本文关键字:函数 重载      更新时间:2023-10-16

为什么X中的方法测试不明确,如何解决?

struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B> {};
int main(int argc, const char *argv[])
{
    X x;
    x.test(A());
    return 0;
}

编译错误:

In function ‘int main(int, const char**)’:
error: request for member ‘test’ is ambiguous
error: candidates are: void I<T>::test(T) [with T = B]
error:                 void I<T>::test(T) [with T = A]

test是不明确的,因为它是X的两个基类的成员。虽然不是两个函数都匹配,但名称匹配。

用显式转发修复:

struct X : public I<A>, I<B> {
    template <typename T>
    void test(T t) { I<T>::test(t); }
};

使用:

struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B> 
{
    using I<A>::test;
    using I<B>::test;
};
int main(int argc, const char *argv[])
{
    X x;
    x.test(A());
    return 0;
}

gcc错误request for member 'test' is ambiguous在这里并不是最好的,我们可以更好地了解clang的错误意味着什么:member 'test' found in multiple base classes of different types

由于X乘法继承自I<A>I<B>,因此对test()的调用不明确。您可以这样做来明确声明您所指的父级:

struct A{};
struct B{};
template<typename T>
struct I { void test(T){} };
struct X : public I<A>, I<B> {};
int main(int argc, const char *argv[])
{
    X x;
    x.I<A>::test(A());
    return 0;
}