2017-05-03 4 views
1

を取得しますそのように:私は上に述べたようにそれを宣言しようとすると、スマートポインタは、私が、私はそうのようにそれを宣言することができますように私自身のスマートポインタを構築しようとしているエラー

template<class T> 
class SmartPtr 
{ 
public: 
    SmartPtr(); 
    explicit SmartPtr(T* _ptr); 
    explicit SmartPtr(const SmartPtr& other); 
} 

はしかし、私は次のエラーを取得する:

error: conversion from ‘MyClass*’ to non-scalar type ‘SmartPtr<MyClass>’ requested 

私は、コピーCTORに '='という特殊な構文があり、そのメソッドでCTORを宣言できないため、エラーが発生していることがわかります。 私の質問は、私は上記の必要な構文を維持する明示的なCTORを持っている方法はありますか?

+0

申し訳ありませんが、私はコピーコンストラクタを意味しました。私は編集します –

答えて

1

My question is, is there any method to keep the required syntax I mentioned above, and have an explicit CTOR?

おそらくそうではありません。その構文はcopy initializationであり、非明示的なコンストラクタが必要です。

コピーコンストラクタは明示的にする必要はありません。それが明示的であれば、値で受け入れる関数にSmartPtrを渡すことはできません。最小構文のオーバーヘッドを使用して、ポインタを構築する


もう一つの方法は、工場の機能を追加したいと、それを使用することです:

template<class T> 
SmartPtr<T> make_ptr(T* p) { 
    return SmartPtr<T>{p}; 
} 

auto ptr = make_ptr(new MyClass); 

あるいは、std::make_shared<>に似て何か:

auto ptr = make_ptr<MyClass>(); 
+0

私は 'いいえ'と思っても受け入れられる答えです。私は、SmartPtr ptr(new MyClass)の構文を使用する方が好きです。しかし、ありがとう!他に誰も肯定的な回答を投稿していない場合は、私はあなたのマークを付けます –

+0

@ofiragranatコピー初期化の場合、答えはいいえです。 'SmartPtr ptr(new MyClass)'は直接初期化されています。 – songyuanyao

関連する問題