отсутствует конструктор по умолчанию при использовании шаблонов - PullRequest
1 голос
/ 28 октября 2011

У нас проблема с использованием шаблона класса, который сам использует функциональные объекты в некоторых своих функциях-членах.Сообщение об ошибке из компилятора 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() {}

исправляетошибка.

Итак, вопрос в том, почему компилятор не генерирует конструктор по умолчанию?

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Как только вы определите любой конструктор самостоятельно, включая конструктор копирования, компилятор больше не генерирует конструктор по умолчанию.

(С другой стороны, конструктор копирования / перемещения равен генерируется по умолчанию, если вы его не предоставите, при условии соблюдения определенных правил.)

0 голосов
/ 28 октября 2011

Компилятор предоставляет конструктор по умолчанию, только если вы не определили любые конструкторы. Так как вы объявили пользовательскую копию конструктор, компилятор его не предоставит.

Похоже, единственная причина, по которой вы объявляете конструктор копирования, сделать его частным и, таким образом, отключить его. В этом случае лучше решение может быть наследовать от boost::noncopyable, который имеет тот же эффект, но не мешает компилятору генерировать конструктор по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...