2015-10-14 1 views
1

Я нашел похожие вопросы, но никто из них не работал для моей ситуации, поэтому я спрашиваю себя.Как передать вектор как параметр в библиотеку C++ из CLI/C++ Wrapper?

Я хочу использовать библиотечную функцию, которая принимает указатель на std :: vector и заполняет его данными.

У меня уже установлен C++/CLI Wrapper. В настоящее время я пытаюсь создать экземпляр вектора в обертке,

private: 
    std::vector<int>* outputVector 

и в конструкторе, я его экземпляр:

outputVector = new std::vector<int>(); 

Теперь в методе обертку, который вызывает C++ функции библиотеки:

m_pUnmanagedTPRTreeClass->GetInRegion(..., &outputVector) 

Я пропустил другие параметры, потому что они не имеют значения для этого случая. Я уже могу использовать другие функции библиотеки, и они работают без проблем. Я просто не могу передать указатель на std :: vector.

С кодом, как это, я получаю сообщение об ошибке:

error C2664: 'TPSimpleRTree<CT,T>::GetInRegion' : cannot convert parameter 3 from 'cli::interior_ptr<Type>' to 'std::vector<_Ty> &' 

Я попытался удалить «&», так как я не большой на C++, и я не уверен, как правильно использовать указатели. Тогда ошибка становится:

error C2664: 'TPSimpleRTree<CT,T>::GetInRegion' : cannot convert parameter 3 from 'std::vector<_Ty> *' to 'std::vector<_Ty> &' 

EDIT: Я попытался заменить "&" на "*", он не работает, я получаю ошибку:

не может конвертировать из «станд :: вектор < _Ty>»на 'станд :: вектор < _Ty> &'

сигнатура функции C++ для вектора так:

GetInRegion(..., std::vector<T*>& a_objects) 
+2

Вы действительно хотите передать адрес указателя вместо указателя? Что такое подпись «GetInRegion»? Пожалуйста, напишите [Минимальный, Полный, Подтверждаемый пример] (https://stackoverflow.com/help/mcve). – robert

+1

Вам не нужно «вводить новый» вектор вообще, просто объявите его перед использованием в вызове функции, передайте адрес вектора (не указателя), а затем выведите данные в коллекцию .Net после вызова функции , – crashmstr

+1

... царапина это! 'GetInRegion' берет * reference * в' vector' 'T *', поэтому вы получили все это назад. – crashmstr

ответ

0

Учитывая подпись:

GetInRegion(..., std::vector<T*>& a_objects) 

Вы назвали бы это (в C++ или C++/CLI), как:

std::vector<int*> v; 
m_pUnmanagedTPRTreeClass->GetInRegion(..., v); 

Затем вы можете манипулировать данными по мере необходимости или Маршаллизация данных в .Net.

+0

Огромное вам спасибо, был скрыт под typedef в библиотеке, я никогда не замечал его последствий. Это исправило это! – Storm

+0

Здравствуйте, снова крах, я хотел отправить вам PM, но я не понял, как, у меня возникают проблемы с преобразованием моего std :: vector в тип, который может использоваться управляемым C#. Моя проблема связана с частью , она не позволит мне конвертировать, когда я пытаюсь либо с помощью списка ^, либо массива . Не могли бы вы дать мне несколько указаний? – Storm

+0

Предполагая, что 'int *' - это просто указатель на 'int', de-reference и сохранить' int'? Не знаете, что касается интерфейса, поэтому не уверен, как он используется. – crashmstr

0

'станд :: вектор < _Ty> *' до 'станд :: вектор < _Ty> &'

само за себя, вам нужно разыменованием вместо того, чтобы указатель, так что вместо из:

m_pUnmanagedTPRTreeClass->GetInRegion(..., &outputVector) 

использование:

m_pUnmanagedTPRTreeClass->GetInRegion(..., *outputVector) 
              ^~~~~~~!! 

после редактирования я вижу ваш getinregion подпись:

GetInRegion(..., std::vector<T*>& a_objects) 

поэтому принимает зЬй :: вектор, где T является указателем, в то время как вы хотите передать getinregion в зЬй :: вектор, где ИНТ не является указателем.

+0

Привет, извините за исключение этого, но я попробовал то, что вы предложили. Я получаю ту же ошибку, кроме ее: 'std :: vector <_Ty>' to 'std :: vector <_Ty> &' – Storm

+0

@Storm см. Мое редактирование. Я признаю, что не знаю, как CLI может вызвать проблемы здесь. – marcinj