【发布时间】:2013-07-12 21:18:11
【问题描述】:
我有一些使用 std::auto_ptr 的代码,并在编译时给出了关于已弃用 std::auto_ptr(Suse Linux 12.2 上的 GCC 4.7.1)的丑陋警告。
所以我尝试了以下方法(因为我找到了一些声明 std::unique_ptr 应该是适当的等价物的来源)
template<typename T>
struct AutoPtr
{
#ifdef COMPILE_FOR_CX11
typedef std::unique_ptr<T> Type;
#else
typedef std::auto_ptr<T> Type;
#endif
};
并将对std::auto_ptr<T> 的所有引用替换为AutoPtr<T>::Type,但使用此选项时出现编译错误。
我很确定我想在这些代码中使用std::auto_ptr 之类的东西,并且我知道它的罪魁祸首和缺陷。我得到的错误似乎与使用 std::unique_ptr 时的构造问题有关。
附带说明:用于构造的最终类是T的继承类型,代码如下:
class MockClass;
class Client
{
public:
Client();
Client(const Client& rhs);
private:
mutable AutoPtr<MockClass>::Type embeddedMock;
};
Client::Client()
: embeddedMock(new ::testing::NiceMock<MockClass>())
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Getting errors here!
{
}
Client::Client(const Client& rhs)
: embeddedMock(rhs.embeddedMock)
{
}
那么,什么是完全兼容的 c++11 集合中的智能指针,我可以在这里使用?
【问题讨论】:
-
包装类有点无意义。您可以只说
#define AutoPtr std::auto_ptr等,然后说AutoPtr<T>。 -
编译错误是什么?
-
应该是
mutable AutoPtr<MockClass>::Type embeddedMock; -
@g-makulik:它似乎工作here
-
@AndyProwl:哎哟!
mutable?哎哟!这是滥用mutable的意图来解决设计的不同限制。两个错误不能使一个正确,即使它可以编译。