shared_ptr:"不是类型"错误

时间:2015-06-08 13:02:10

标签: c++ shared-ptr

我创建了一个简单的程序来测试智能指针。我从标准库开始,但后来我想使用boost。我有这样的编译问题:

In file included from main.cpp:1:0:
test.hpp:14:21: error: ‘p’ is not a type
   shared_ptr<int>a (p);
                 ^

我的文件和makefile:

test.hpp:

#include <string>
#include <stdlib.h>
#include <vector>
#include <memory>
#include <boost/filesystem.hpp>

using namespace std;

class test{
    private:
        int* p = new int(10);
        shared_ptr<int>a (p);
    public:
        test() {}
        void get_pointer();
};

TEST.CPP:

#include "test.hpp"

void test::get_pointer()
{
    printf("%s\n",*a.get());
}

main.cpp中:

#include "test.hpp"
#include <memory>
using namespace std;
int main()
{
    test tescik;
    tescik.get_pointer();
    int b;
    scanf("%d",&b);
    return 0;
}

生成文件:

tester: main.cpp test.cpp
    g++ -o tester -std=c++11 main.cpp test.cpp -lboost_system -lboost_filesystem -lglfw3 -lGLU -lGL -lX11 -lXxf86vm -lXcursor -lrt -lm -lXinerama -lXrandr -lpthread -lXi -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_video -lopencv_objdetect

我知道我过度扩展了编译设置(opengl和boost),但我稍后会使用它们。任何想法为什么这么简单的程序都不起作用?

2 个答案:

答案 0 :(得分:3)

您无法在旧版本的C ++中初始化数据成员。试试这个:

class test{
    private:
        int* p;
        shared_ptr<int> a;
    public:
        test() : p(new int(10)), a(p) {}
        void get_pointer();
};

答案 1 :(得分:1)

  

大括号或等于初始化程序只能出现在数据成员的声明中。 (对于静态数据成员,   见9.4.2;对于非静态数据成员,请参见12.6.2)。用于非静态数据成员的大括号或等于初始化程序   不得直接或间接导致封闭的默认默认构造函数的隐式定义   类或该构造函数的异常规范。

您已使用括号直接在其声明中初始化数据成员。使用大括号或相等的初始值设定项,或在构造函数的初始化列表中移动初始化。

就我个人而言,我建议总是使用大括号初始化(现在可能只有auto,因为它很快就会发生变化),因为它是唯一可以在任何地方使用的初始化