2011-10-28 25 views
1

クラステンプレートの一部のメンバー関数で関数オブジェクトを使用するクラステンプレートを使用する際に問題があります。エラーメッセージは、VS2010のコンパイラを形成している。テンプレートを使用しているときにデフォルトのコンストラクタがありません

エラーC2512: 'SimpleFunctor :: SimpleFunctor':次のようにありません適切なデフォルト コンストラクタが利用可能

はこれを再現するために小型化コードは次のとおりです。

// myfunctor.h

class SimpleFunctor 
{ 
    private: 
    SimpleFunctor(const SimpleFunctor&); 
    SimpleFunctor& operator=(const SimpleFunctor&); 
    public: 
    bool operator()() { return true; } 
}; 

// mytemplate.h

#include "myfunctor.h" 

template< typename T > 
class Test 
{ 
    private: 
    Test(const Test&); 
    Test& operator=(const Test&); 
    public: 
    Test(){} 

    void testFunction(T parameter) 
    { 
     bool result = SimpleFunctor()(); 
    } 
}; 

// main.cppに

#include "HK_Template.h" 

int main() 
{ 
    Test<int> obj; 
    obj.testFunction(5); 

    return 0; 
} 

この例では、次のようにクラスSimpleFunctorにデフォルトコンストラクタを追加するので、正しいと思わ上記のエラーメッセージが表示されます。

SimpleFunctor() {} 

はエラーを修正します。

なぜ、コンパイラはデフォルトのコンストラクタを生成しないのですか?

+0

+1非常によく提示された質問 –

答えて

5

コピーコンストラクタを含め、コンストラクタを自分で定義すると、コンパイラはデフォルトのコンストラクタをもう生成しません。

(一方、コピー/移動コンストラクタあなたは一定のルールに従うものを、提供しない場合、デフォルトで生成さです。)

+0

Aw、私はまさに同じ答えをしようとしていました!私から '+ 1 '。 – sbi

+0

正確には、この動作はテンプレートとは関係ありません。一般的なC++ルール –

0

あなたはドンする場合、コンパイラは、デフォルトのコンストラクタを提供」任意のコンストラクタを に定義します。ユーザ定義のコピー コンストラクタを宣言したので、コンパイラはコンストラクタを提供しません。

コピーコンストラクタを宣言しているのは だからプライベートにして無効にすることができるようです。その場合、より良い ソリューションはboost::noncopyableから継承される可能性がありますが、 の同じ効果がありますが、コンパイラが デフォルトコンストラクタを生成することを妨げません。

+0

または[明示的に削除](http://en.wikipedia.org/wiki/C%2B%2B11# Explicitly_defaulted_and_deleted_special_member_functions)コピーコンストラクタ。 –

+0

@AlsコンパイラがC++ 11をサポートしている場合にのみ可能です。ほとんどの開発者にとってはオプションではありません。 –