【问题标题】:shared_ptr not defined when including from managed code从托管代码中包含时未定义 shared_ptr
【发布时间】:2011-07-19 04:34:42
【问题描述】:

我正在尝试围绕非托管 C++ 静态库编写托管包装器 (C++/CLI),但遇到了两个问题:

  1. 非托管库在其标头中使用std::shared_ptr。包含<memory>,并且标头作为非托管项目的一部分进行编译。但是,当我在托管项目中包含此标头时,我收到此错误:

    错误 C2039:“shared_ptr”:不是“std”的成员

  2. 如何从 C++/CLI 访问 SortedDictionary<K, V>Values 集合?我似乎找不到任何正确语法的示例,并且 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);
    };
}

【问题讨论】:

  • 嗨嗨,很酷,您发现了错误。哪怕是题外话。文档指出,每个 #pragma managed(push, off) 都应该在包含之后发生,这对于第三方库显然是不可能的,但对于 STL 标头是可能的。 msdn.microsoft.com/en-us/library/0adb9zxe(v=vs.100).aspx

标签: visual-studio-2010 c++-cli shared-ptr


【解决方案1】:

shared_ptr 位于 &lt;memory&gt; 而不是 &lt;functional&gt;。让它看起来像这样:

#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);
    }

【讨论】:

  • 谢谢,我的问题打错了。我包括&lt;memory&gt; 并且仍然遇到完全相同的问题。我也已经有了与演示完全相同的 #pragma managed 语句。
  • 我无法从这里看到您的屏幕。发布一些我们可以查看的内容。
  • 已添加代码。创建了一个新的类库项目并将其放在生成的头文件中。
  • 我尝试时效果很好。 [visual-studio-2010] 标签是否准确?
  • 是的。版本 10.0.30319.1 RTMRel。我不相信我已经安装了 SP1。也许我会尝试一下。
【解决方案2】:

我在这里找到了答案:Edit $(IncludePath) "macro" in Visual Studio 2010

Visual Studio 2010 包含来自 Visual Studio 2008 的标头,这些标头没有 shared_ptr

确切的分辨率描述为here。常规选项卡上的平台工具集默认为vs90。将其更改为 vs100 解决了该问题。

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多