Неоднозначный вызов с list_of в VS2010

Я пытаюсь преобразовать проект из VS2008 в 2010, но столкнулся с проблемой из-за добавленных конструкторов перемещения (и, вероятно, из-за того, что здесь есть вложенные list_of). Следующий фрагмент кода показывает ошибку (в реальном коде эти конструкции используются для инициализации некоторой статики):

enum some_enum {R, G, B};

typedef std::pair<some_enum, some_enum> Enum_Pair;
typedef std::vector<some_enum> Enum_list;
typedef std::pair<Enum_Pair, Enum_list> Some_Struct;
typedef std::list<Some_Struct> Full_Struct;

#define MAKEFULLSTRUCT(First_, Second_, some_enums)\
(Some_Struct(Enum_Pair(First_, Second_), list_of (some_enums) ))

int main()
{
int i = G;
Full_Struct test_struct = list_of
MAKEFULLSTRUCT(R, R, R).to_container(test_struct);
}

что приводит к

error C2668: 'std::vector<_Ty>::vector' : ambiguous call to overloaded function
with  [_Ty=some_enum]
vector(593): could be 'std::vector<_Ty>::vector(std::vector<_Ty> &&)'
with  [ _Ty=some_enum]
vector(515): or       'std::vector<_Ty>::vector(unsigned int)'
with  [ _Ty=some_enum]
while trying to match the argument list '(boost::assign_detail::generic_list<T>)'
with  [ T=some_enum ]

Есть ли способ решить эту проблему, все еще используя boost :: list_of? Или мне нужно переключиться на другой механизм инициализации?

2

Решение

Это похоже на ошибку в Boost.Assign. Тип возврата list_of имеет общее преобразование в тип T не пытаясь сдерживать T совсем. Следовательно, либо std::vector конструктор — тот, который принимает std::vector && и тот, который занимает unsigned int — одинаково хорошо, что приводит к неоднозначности.

Обходной путь для вас будет использовать convert_to_container, следующее:

#define MAKEFULLSTRUCT(First_, Second_, some_enums)\
(Some_Struct(Enum_Pair(First_, Second_), \
list_of(some_enums).convert_to_container<Enum_list>()))
7

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector