4

例如我想简化std::tr1::shared_pointer模板类。我想为std::tr1::shared_pointer.

但这不起作用:

#include <tr1/memory>

template <class T>
class SharedPointer : public std::tr1::shared_ptr<T>
{
};

int main(int argc, char *argv[])
{
    SharedPointer<int> test(new int(5));
    return 0;
}

由于构造函数不是继承的。

有解决这个问题的模式吗?

4

2 回答 2

7

如果你想给它起别名,using声明将创建一个真正的别名,而不是一个子类:

template<class T>
using SharedPointer = std::tr1::shared_ptr<T>;

编辑

一种适用于 GCC 4.6.* 编译器的方法是围绕std::tr1::shared_ptr<T>. 由于 GCC 4.6.* 支持 C++11 库,我使用它而不是 TR1:

#include <memory>
#include <utility>

template<typename T, typename... Args>
std::shared_ptr<T> make_shared_ptr(Args &&... args)
{
    return std::shared_ptr<T>(std::forward<Args>(args)...);
}

int main(int argc, char *argv[])
{
    auto test = make_shared_ptr<int>(new int(5));
    return 0;
}
于 2012-05-29T23:50:44.877 回答
5

如果您不使用 C++11,那么不幸的是,您能做的最好的事情是:

template <class T>
struct SharedPointer
{
    typedef std::tr1::shared_ptr<T> type;
};

必须用作:

SharedPointer<int>::type x(new(int));
于 2012-05-30T00:10:23.370 回答