shared_ptr не определяется при включении из управляемого кода - PullRequest
3 голосов
/ 18 июля 2011

Я пытаюсь написать управляемую оболочку (C ++ / CLI) вокруг неуправляемой статической библиотеки C ++, и у меня возникли две проблемы:

  1. Неуправляемая библиотека использует std::shared_ptr в своих заголовках. <memory> включено, и заголовок компилируется как часть неуправляемого проекта. Однако, когда я включаю этот заголовок в управляемый проект, я получаю эту ошибку:

    ошибка C2039: «shared_ptr»: не является членом «std»

  2. Как получить доступ к коллекции Values SortedDictionary<K, V> из C ++ / CLI? Кажется, я не могу найти никаких примеров правильного синтаксиса, а синтаксис в стиле C # не компилируется.

Код для № 1:

// 1>Dummy.h(10): error C2039: 'shared_ptr' : is not a member of 'std'
#pragma once

#pragma managed(push, off)

#include <memory>

class Foo {};
typedef std::shared_ptr<Foo> FooPtr;

#pragma managed(pop)


using namespace System;

namespace Dummy {

    public ref class Class1
    {
    public:
        Class1(FooPtr);
    };
}

Ответы [ 2 ]

6 голосов
/ 18 июля 2011

shared_ptr живет в <memory>, а не <functional>.Сделайте так, чтобы это выглядело примерно так:

#pragma managed(push, off)
#include <memory>
#include "yourUnmanagedLibrary.h"
#pragma managed(pop)

Второй вопрос (задайте только один, пожалуйста):

using namespace System::Collections::Generic; 
...
    SortedDictionary<int, String^>^ coll = gcnew SortedDictionary<int, String^>;
    coll->Add(1, "one");
    coll->Add(0, "zero");
    for each (String^ value in coll->Values) {
        Console::WriteLine(value);
    }
3 голосов
/ 19 июля 2011

Я нашел ответ здесь: Изменить $ (IncludePath) «макрос» в Visual Studio 2010

Visual Studio 2010 включает в себя заголовки из Visual Studio 2008, которые не имеютshared_ptr.

Точное разрешение описано здесь .Набор инструментов платформы на вкладке Общие по умолчанию имеет значение vs90.Изменение этого значения на vs100 решило проблему.

...