2012-04-05 19 views
1

std::auto_ptrの使用に問題があります。私はGCC 4.6.1を使ってUbuntu 11.10で次のようにコンパイルしようとしました。エラーメッセージerror: no match for call to ‘(std::auto_ptr<int>) (int*)’が出ます。std :: auto_ptrを初期化しています: "エラー: '(std :: auto_ptr <int>)(int *)'への呼び出しに一致しません。"

#include <memory> 
#include <iostream> 

class Toy { 

public: 
    std::auto_ptr<int> foo; 

    Toy() { 
     foo(new int(3)); 
    } 
}; 

int main() { 

    Toy toy; 

    std::cout << *toy.foo << std::endl; 

    return 0; 
} 

私はstd::auto_ptr<T>は、そのコンストラクタの引数としてT*にかかるかなり確信していたが、どうやらない...私の謝罪これは些細なまたは重複した質問であるならば、私はアーカイブを検索し、発見していません答え。 thisのような場所は、上記のコードがうまくいくはずです。とにかく、どんな助けもありがとう!

答えて

2

を親オブジェクトを構築することができます。

class Toy { 

public: 
    std::auto_ptr<int> line; 

    Toy() : line(new int(3)) 
    { 

    } 
}; 

そうでない場合は、デフォルトの初期化lineを取得し、そのreset方法でそれを取り付け直し可能性があります

class Toy { 

public: 
    std::auto_ptr<int> line; 

    Toy() 
    { 
     line.reset(new int(3)); 
    } 
}; 

しかし、このコードでより多くの問題があります。まず、new int(3)は3つの配列を作成しません(私が思うと思いますが)int3に初期化されています。おそらく意味はnew int[3]でした。

しかしnew int[3]delete[]を解放する必要があるだろうが、auto_ptrは使用しています平野delete、すなわち、配列を管理するためのものではありません。これは、配列を管理するために標準ライブラリが提供するソリューションがstd::vectorであるため、std::vectorは「通常の」ダイナミックアレイよりもオーバーヘッドがほとんどないため、自作ソリューションではなく、おそらく使用する必要があります。

+1

リセット機能についてお返事ありがとうございます!私はそれが私が必要とするかもしれないと思います。そして私は新しいint(3)を意味しました。これは私が問題を抱えているコードではありません。これはテストするために思いついたおもちゃの例です。intに値を入力して画面に印刷する必要がありました。 –

+0

@anjruu:ok、答えの最初の部分だけを残しておいてください。それは、 'line'という名前のフィールドに割り当てられた' new int(3) 'が、その潜在的な誤解について私の頭の中で警鐘を鳴らしたことだけです。 –

+0

ああ、あなたはまったく正しい。元のコードから変更するのを忘れてしまった、ありがとう。私は私の質問でそれを編集します。 –

0

コンストラクタを呼び出していません。代わりに、存在しない関数呼び出し演算子を呼び出そうとします。これらは、コンストラクタを呼び出します。

Toy() : line(new int(3)) { 

か(ない正確に何をしたい)

Toy() { 
    auto_ptr<int> line(new int(3)); 

または(上記のように、ではない何をしたい)

Toy() { 
    auto_ptr<int>(new int(3)); 
1

あなたの悩みではありませんauto_ptrであるが、C++のコンストラクタである。これは値3を持つ単一の動的int作成すること

Toy() : line(new int(3)) { } 

注:は、コンストラクタの初期化子リストでクラスのメンバを初期化するには必要です。

0

これは、メンバー変数を作成する場所ではありません。イニシャライザリストを使用したいとします。

Toy() 
    : line(new int(3)) 
{ } 

メンバーは、コンストラクタのコードが実行さちょうど前に、あなたのクラスを構築しています。あなたはそれらをコンストラクタコードで割り当てることができます。それらは、クラス定義に現れる順序で構成されます。は、このリストに表示される順序ではありません。。ほとんどのコンパイラは、混乱を避けるために、このリストの順序が間違っていると警告します。 (それは名前がありませんので)また、あなたが初期化リストの構文を使用したクラスのフィールドを初期化するには

親クラスタイプを使用して、同じように
class Toy : public Thing { 
    Toy() : Thing("APPLE") {} 
}; 
関連する問題