Я пытаюсь собрать этот пример, в котором шаблон VARIADIC класс наследует от VARIADIC количества оснований, каждое из которых реализует различные operator[]
:неоднозначным оператор [] в шаблоне VARIADIC
#include <iostream>
template <typename T>
struct Field {
typename T::value_type storage;
typename T::value_type &operator[](const T &c) {
return storage;
}
};
template<typename... Fields>
struct ctmap : public Field<Fields>... {
};
int main() {
struct age { typedef int value_type; };
struct last_name { typedef std::string value_type; };
ctmap<last_name, age> person;
person[last_name()] = "Smith";
person[age()] = 104;
std::cout << "Hello World!" << std::endl;
return 0;
}
Когда я компилирую с GCC (Debian 4.9.2-10), я получаю следующую ошибку
main.cpp: In function ‘int main()’:
main.cpp:22:23: error: request for member ‘operator[]’ is ambiguous
person[last_name()] = "Smith";
^
main.cpp:7:27: note: candidates are: typename T::value_type& Field<T>::operator[](const T&) [with T = main()::age; typename T::value_type = int]
typename T::value_type &operator[](const T &c) {
^
main.cpp:7:27: note: typename T::value_type& Field<T>::operator[](const T&) [with T = main()::last_name; typename T::value_type = std::basic_string<char>]
main.cpp:23:17: error: request for member ‘operator[]’ is ambiguous
person[age()] = 104;
^
main.cpp:7:27: note: candidates are: typename T::value_type& Field<T>::operator[](const T&) [with T = main()::age; typename T::value_type = int]
typename T::value_type &operator[](const T &c) {
^
main.cpp:7:27: note: typename T::value_type& Field<T>::operator[](const T&) [with T = main()::last_name; typename T::value_type = std::basic_string<char>]
Почему это неоднозначно?
Это принимается на лязг ++ 3.8: http://melpon.org/wandbox/permlink/huzwGp0kc2OafMZl (но я 'm не уверен, какой компилятор прав в этом случае) – dyp
(В основном функции-члены в нескольких базовых классах не перегружаются. Я не уверен, как это взаимодействует с поиском оператора, хотя на первый взгляд кажется, что clang неверен.) – dyp
Вы можете сделать это совместимым с линейным/t на основе наследования на основе ree и 'using'. – Yakk