MSVC 10 + Luabind + std :: vector == отказаться от компиляции - PullRequest
2 голосов
/ 02 сентября 2010

Итак, у меня есть код, который скомпилирован на MSVC 9 и несколько предыдущих (не знаю, как далеко он уходит ...), GCC, MingW, GCC на Mac ...

Но одна строка,не компилируется в MSVC:

class_< vector<unsigned int> >("LayerList")
.def(constructor<>())
.def("GetCount", &vector<unsigned int>::size)
.def("Get",  &NumberGet)
.def("Add", &vector<unsigned int>::push_back) //this line refuses to compile
.def("__tostring", &LayerListToString)

Если я прокомментирую это, приложение скомпилируется нормально (но прерывается во время выполнения), если я перемещаю этот блок куда-то еще (даже в другие файлы), эта конкретная строка продолжает выдавать ошибки... изменение порядка внутри блока тоже не решает.

Это дает 9 ошибок, большинство из которых о неправильном количестве аргументов в .def (некоторые говорят, что есть 2 аргумента, когда ожидалось 1, 3, 5 и один говорит «слишком много аргументов»), а некоторые о сбое при перегрузке, наиболее очевидный:

Ошибка 7, ошибка C2914: «luabind :: class _ :: def»: невозможно вывести шаблонаргумент как функция аргумент является неоднозначным E: \ novashellSVN \ clanlibstuff \ novashell \ source \ ListBindings.cpp 178

Это заставило меня напрасно тратить весь рабочий день ... Кто-то знает, что изменилось в MSVC10, чтобы вызвать это?Это меня больше не беспокоит из-за застрявшей работы, а потому, что это странно и странно.

РЕДАКТИРОВАТЬ: Я сравнил «векторный» файл из MSVC 10 с другими MSVC и GCC, и действительнов MSVC есть 3 версии, кто-то точно знает, как я могу загрузить конкретную версию?

Три версии:

void push_back(const _Ty& _Val) //the one in GCC and older MSVC, thus the one I want
void push_back(_Ty&& _Val)
void push_back(bool _Val)

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Как говорит Никко, вы должны выбрать правильную перегрузку. Это немного C ++ PITA.

Используйте static_cast <> для приведения push_back к ptr-to-mem-fn правильного типа. то есть что-то вроде следующего:

.def("push_back", static_cast<void (std::vector<unsigned int>::*)(const unsigned int)>(&std::vector<unsigned int>::push_back))

(не уверен на 100% в деталях, но в этом и суть ...)

0 голосов
/ 02 сентября 2010

Если у вас перегружены функции, вы должны указать, какую из них вы хотите использовать, приведя "& vector :: push_back" к правильной функции.Вы должны проверить документацию luabind на предмет синтаксиса.

Может быть, теперь есть несколько методов с именем "push_back", и вы должны указать, какой из них использовать?

...