/ / Вкладений прискорений :: присвоєний: list_of зламаний у Visual Studio 2012 - неоднозначний виклик перевантаженої функції - c ++, boost, visual-studio-2012

Вкладений приріст :: assign: list_of зламаний у Visual Studio 2012 - неоднозначний виклик перевантаженій функції - c ++, boost, visual studio-2012

Це працює в Visual Studio 2010, але це не в оновлення 2 для 2012 (з Boost 1.5.3):

vector<vector<BYTE>> data = assign::list_of (assign::list_of (0x06)(0x02));

Помилка компілятора (оновлена):

C:Program Files (x86)Microsoft Visual Studio 11.0VCincludexmemory0(617): error C2668: "std::vector<_Ty>::vector" : ambiguous call to overloaded function
with
[
_Ty=BYTE
]
C:Program Files (x86)Microsoft Visual Studio 11.0VCincludevector(786): could be "std::vector<_Ty>::vector(std::vector<_Ty> &&)"
with
[
_Ty=BYTE
]
C:Program Files (x86)Microsoft Visual Studio 11.0VCincludevector(693): or       "std::vector<_Ty>::vector(unsigned __int64)"
with
[
_Ty=BYTE
]
while trying to match the argument list "(boost::assign_detail::generic_list<T>)"
with
[
T=int
]
... (dozens of more lines)

Будь-який спосіб подолати цю помилку?

Відповіді:

1 для відповіді № 1

Я не думаю, що проблема полягає в вбудовуванні, це у створенні тимчасового значення за допомогою list_of. Це має працювати:

vector<BYTE> temp = assign::list_of (0x06)(0x02);
vector<vector<Byte> > data = assign::list_of(temp);

0 для відповіді № 2

Я не маю VC11, тому просто дивна здогадка ... Можливо, VC11 плутається, оскільки ваші цілі числа можуть бути перетворені на BYTE і так було б використано або для того, щоб рухатися-конструктор size_t і так std::vector(size_t) конструктор буде використаний.

Спробуйте перетворитись на BYTE щоб уникнути неявного перетворення:

vector<vector<BYTE>> data = assign::list_of (assign::list_of (static_cast<BYTE>(0x06))(static_cast<BYTE>(0x02)));

0 для відповіді № 3

Вам потрібно допомогти boost :: призначити :: list_of трохи з параметрами шаблону:

// C2668:
std::vector<std::vector<int>> foo1 =
boost::assign::list_of(boost::assign::list_of(0)(1));

// no C2668:
std::vector<std::vector<int>> foo2 =
boost::assign::list_of<std::vector<int>>(boost::assign::list_of(0)(1));