Использование тегов в перегрузке функций - PullRequest
3 голосов
/ 05 января 2012

Почему проверка метода в 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]

Ответы [ 3 ]

6 голосов
/ 05 января 2012

test неоднозначно, потому что он является членом двух базовых классов X.Хотя не совпадают обе функции, имя совпадает.

Исправлено с явным форвардом:

struct X : public I<A>, I<B> {
    template <typename T>
    void test(T t) { I<T>::test(t); }
};
3 голосов
/ 05 января 2012

Использование с использованием:

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

1 голос
/ 05 января 2012

Поскольку X multiply наследуется от 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...