2013-07-25 4 views
2

Я пытаюсь реализовать PIMPL с помощью компилятора g ++ на моей локальной установке CygWin, и я начинаю думать, что это может быть тот факт, что я запускаю g ++ 4.3.4, поскольку его поддержка C++ 11 менее, чем идеально.Поддерживает ли gcc 4.3.4 unique_ptr?

С самого базового кода (от MSDN here):

my_class.h: 
    #include <memory> 
    class my_class { 
    public: 
     my_class(); 
    private: 
     class impl; unique_ptr<impl> pimpl(new impl); 
    }; 

my_class.cpp: 
    #include "my_class.h" 
    class my_class::impl { int my_int; }; 
    my_class::my_class(): pimpl(new impl) {}; 

Я пытаюсь скомпилировать с g++ -std=c++0x -o my_class.o my_class.cpp и в конечном итоге с:

In file included from my_class.cpp:1: 
my_class.h:8: error: ISO C++ forbids declaration of 'unique_ptr' with no type 
my_class.h:8: error: invalid use of '::' 
my_class.h:8: error: expected ';' before '<' token 
my_class.cpp: In constructor 'my_class::my_class()': 
my_class.cpp:5: error: class 'my_class' does not have any field named 'pimpl' 

Я также получить, что если я заменяю -std=gnu++0x.

В самом деле, когда я пытаюсь скомпилировать даже самый простой файл, поднятый из другого SO ответ:

#include <iostream> 
#include <memory> 
int main() { 
    std::unique_ptr<int> up(new int(30)); 
} 

жалуется, что unique_ptr не в std пространстве имен.

gcc c++11 support page не имеет вход для unique_ptr, но, глядя на сетку, это было довольно долгое время, по наименее так 4.4.

Так что мой вопрос, во-первых, в какой версии gcc была поддержка unique_ptr?

И, во-вторых, я просто делаю ошибку в моем костюме, используя это неправильно?

ответ

4

В вашем первом примере на unique_ptr отсутствует квалификатор std::. Второй пример is correct C++11.

Согласно the GCC 4.4 release notes, unique_ptr не в стандартной библиотеке GCC в C++, прежде чем 4.4:

Улучшенная экспериментальная поддержка ISO C++ стандарт наступающего, C++ 0x, в том числе:

...

  • unique_ptr, <algorithm> дополнение, распространение исключения, и поддержка новых типов символов в <string> и <limits>.