在使用中出现错误:命名空间'std'中的'shared_ptr'未定义为类型。

25

我正在尝试在Android Studio(ndk r10d)中编译一个使用一些C++代码的Android应用程序。我需要C++11,因此我添加了 -std=gnu++11 (我需要 gnu++11 而不是 c++11,因为我正在使用某个扩展)。由于我正在使用其他使用此stl库的库,因此我正在使用stlport stl。

因此,我的build.gradle文件中的cFlags和stl参数如下:

stl "stlport_static"
cFlags " mylib1.a mylib2.a ... -fexceptions -frtti -std=gnu++11"

我还包含了内存:#include <memory>

编译时出现以下错误:

'shared_ptr' in namespace 'std' does not name a type

目前我一直在使用boost实现的智能指针,但是随着转向c++11,我更愿意使用标准实现。


导致错误的实际代码是什么? - Kerrek SB
原始错误在于我添加的这个宏定义,以使代码更短,但是无论我在哪里尝试使用这个宏定义,错误都会出现在文件中。#define myapp_shared_ptr std::shared_ptr - royeet
shared_ptr不是一个类型名,它是一个类型模板。你确定在使用时写的是shared_ptr<T>吗?如果省略了它,我得到的错误是“使用类模板需要模板参数”。 - Charlie
我认为STLport没有C++11的特性。 - T.C.
3个回答

45

1
这是必要的吗? - IgorGanapolsky
1
我曾经遇到过同样的问题,当使用stlport_static时,在<memory>中未定义shared_ptr。这个答案毫无意义。 - juzzlin
2
#include <memory> 对我有用。标准规定它在 <memory> 中定义。 - nishant
1
对我来说,在Linux上使用g++是必要的,但在Windows上使用msvc则不需要。 - g01d
2
你不需要在上面加入<iostream>,只需加入<memory>。 - Goblinhack
在命名空间'std'中,'auto_ptr'的类似错误未定义为类型。 - Mona Wade

2

@T.C 看起来你是对的。我在寻找解决方案时,在另一个问题上看到了你的说法,但由于我使用的库正在使用C++11和STLport编译,所以我认为这种说法可能不正确。

我认为发生的事情是我正在使用的库没有使用STLport缺失的任何C++11功能。它们仅使用gcc编译器支持的C++11功能。我需要gnuStl来支持我使用的功能。

我的解决方案是使用boost实现智能指针和所有其他缺失的C++11功能。


是的,GNU STL支持所有C++11功能。 - juzzlin

1

我通过谷歌搜索类似的错误信息来到了这里,但是那个答案并没有起作用:

error: ‘shared_pointer’ in namespace ‘std’ does not name a template type

在我的情况下,这是一个打字错误:

std::shared_pointer

应该是

std::shared_ptr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接