2010-09-02 3 views
2

Итак, у меня есть код, который скомпилирован на MSVC 9 и некоторые предыдущие (не знаю, как далеко он идет ...), GCC, MingW, GCC on Mac ...MSVC 10 + Luabind + std :: vector == отказаться от компиляции

но одна линия, не компилируется на 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 :: класс _ :: Защита': не может вывести аргумент шаблона в качестве аргумента функции является ambiguou E: \ novashellSVN \ clanlibstuff \ novashell \ источник \ ListBindings.cpp 178

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

EDIT: Я сравнивал «векторный» файл с 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) 

ответ

0

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

Возможно, теперь существует несколько методов с именем «push_back», и вы должны указать, какой из них использовать?

1

Как говорит Никко, вы должны выбрать правильную перегрузку. Это немного 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% уверен в деталях, но вот общая суть этого ...)