我一直在尝试在我的本地 CygWin 安装上使用 g++ 编译器来实现 PIMPL,我开始认为这可能是我正在运行 g++ 4.3.4 的事实,因为它的 C++11 支持少于完美的。
使用非常基线代码(来自 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 支持页面没有条目,但是unique_ptr
从网上看,它已经存在了很长一段时间,至少从 4.4 开始。
所以我的问题是,首先,在哪个版本中添加了gcc
支持unique_ptr
?
其次,我是否只是在代码中犯了一些愚蠢的错误,以错误的方式使用它?