2012-01-05 2 views
3

Почему метод test в 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; 
} 

Compile:

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] 
+0

Вы предполагаете, что текущий код неоднозначен и не компилируется, что этот код исправляет двусмысленность, но вам не нравится стиль, что? – Useless

+0

@ Безболезненно, я немного уточнил вопрос, чтобы уточнить – Allan

ответ

6

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

Фикс с явным вперед:

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

+1 Да, это путь. Гораздо удобнее, чем мой ответ. –

+0

@ ltn100: Спасибо, хотя мне нравится, что PlasmaHH «использует» еще лучше. :-) – thiton

+0

Это немного читаемо, но вам нужно будет добавить новый оператор using для каждого нового базового класса. Я не сторонник множественного наследования, но, похоже, это функциональность, которой занимается OP. –

1

Поскольку 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; 
} 
3

использования с помощью:

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; 
} 

ССАГПЗ ошибка request for member 'test' is ambiguous не действительно лучшее здесь, мы можем лучше видеть то, что имел в виду ошибка clang: member 'test' found in multiple base classes of different types

+0

Подход пересылки thiton означает, что вы пишете 10 функций пересылки, а не 100 с помощью операторов. – Useless

+0

@ Необработанность: вопрос OP не указан, чтобы выбрать, какое решение действительно лучше; если для реальной проблемы требуется пересылка более сложных/необычных типов, вам нужно быть более осторожным и, по крайней мере, использовать то, что C++ 11 называет «идеальной переадресацией». Но даже в этом случае перегрузки принимают указатели на функции, и вы передаете перегруженную функцию в тестовую функцию, пересылка не поможет вам там, чтобы перегрузка соответствовала выбранному параметру функции. – PlasmaHH

Смежные вопросы