2015-06-08 7 views
0

Я создал простую программу для проверки интеллектуальных указателей. Я начал со стандартной библиотеки, но позже я хочу использовать boost. У меня есть такая проблема компилирования:shared_ptr: ошибка «не является типом»

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

Makefile:

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 и форсированные), но я буду использовать их позже. Любые идеи, почему простая программа не работает?

+1

Какую версию gcc вы используете? – KABoissonneault

ответ

3

Вы не можете инициализировать такие элементы данных, как в старых версиях C++. Попробуйте вместо этого:

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

Я думаю, что фактическая проблема заключается в том, что вы не можете использовать круглые скобки в инициализации прямого члена. Только = или {} инициализация – KABoissonneault

+0

@KABoissonneault Интересно, я хотел бы прочитать ваш ответ на это. – fredoverflow

1

скобой или равно-инициализатор должен появиться только в объявлении элемента данных. (Для статических элементов данных, см. 9.4.2, для нестатических элементов данных, см. 12.6.2). Инициализатор скобок или равный для нестатического элемента данных не должен прямо или косвенно приводить к неявному определению стандартного конструктора по умолчанию для класса или спецификации исключения этого конструктора.

Вы использовали круглые скобки для инициализации элемента данных непосредственно в его объявлении. Используйте скобу или равный инициализатор или переместите инициализацию в списке инициализаторов конструктора.

Лично я рекомендую всегда использовать инициализацию скобки (за исключением, может быть, прямо сейчас с авто, потому что скоро произойдет перерыв), потому что это единственный вид инициализации, который можно использовать где угодно.

Смежные вопросы