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 に答える