我创建了一个简单的程序来测试智能指针。我从标准库开始,但后来我想使用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),但我稍后会使用它们。任何想法为什么这么简单的程序都不起作用?
答案 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,因为它很快就会发生变化),因为它是唯一可以在任何地方使用的初始化