Компилятор выдаёт следующие ошибки: C2760 и C1903; Первая ошибка на строках - 17, 69, 20, 49; Последняя на 17 и 1 строке;

224
08 января 2022, 06:40

Ошибки:

1>D:\Projects\Engine\Titan\Titan\Source.cpp(17,69): error C2760: синтаксическая ошибка: непредвиденный токен ";"; требуется "{" 1>D:\Projects\Engine\Titan\Titan\Source.cpp(26): message : выполняется компиляция ссылки на экземпляр класс шаблон функции "plane_metric::plane" 1>D:\Projects\Engine\Titan\Titan\Source.cpp(20,49): error C2760: синтаксическая ошибка: непредвиденный токен ";"; требуется "{" 1>D:\Projects\Engine\Titan\Titan\Source.cpp(17,1): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции

#include < iostream>
namespace plane_metric 
{
    template<typename Field>
    class plane 
    {
    private:
        Field** field   = nullptr;  // Field Buffer
        int str         = 0;        // Strings Count
        int coll        = 0;        // Collums Count
        void clear(Field def);      // Filling field buffer default value
    public:
        /* Constructors */
        plane(const int str, const int coll);
        plane(const int str, const int coll, Field def) : plane(str, coll);
        plane(Field** field);
        plane(Field** field, Field def) : plane(field);
        /* Main Funclional */
        void fill(Field ch);
    };
}
int main() {
    //std::cout << "Hello, world !" << std::endl;
    plane_metric::plane<char> obj(10, 10, '?');
    std::cout << std::endl;
    return 0;
}
template<typename Field>
void plane_metric::plane<Field>::clear(Field def)
{
    for (size_t i = 0; i < this->str; i++) {
        for (size_t j = 0; j < this->coll; j++) {
            this->field[i][j] = def;
        }
    }
}
template<typename Field>
plane_metric::plane<Field>::plane(const int str, const int coll)
{
    this->str   = str;
    this->coll  = coll;
    this->field = new Field * [this->str];
    for (size_t i = 0; i < this->str; i++) {
        field[i] = new Field[this->coll];
    }
}
template<typename Field>
plane_metric::plane<Field>::plane(const int str, const int coll, Field def)
{
    clear(def);
}
template<typename Field>
plane_metric::plane<Field>::plane(Field** field)
{
    this->field = field;
}
template<typename Field>
plane_metric::plane<Field>::plane(Field** field, Field def)
{
    clear(def);
}
template<typename Field>
void plane_metric::plane<Field>::fill(Field ch)
{
    clear(ch);
}
Answer 1

Если вы собираетесь использовать делегирование конструкторов - используйте. Но это тем не менее не избавляет вас от необходимости предоставлять тело для конструктора, пусть даже и пустое

plane(const int str, const int coll, Field def) : plane(str, coll)
  {}

Однако дальше по коду вы вдруг снова предоставляете определение для того же самого конструктора. Что это за чушь? Определение должно быть одно. Соберите все в одно место.

Либо в определении класса оставьте только объявление конструктора

plane(const int str, const int coll, Field def);

а все остальное поместите в определение конструктора за пределами класса

template<typename Field>
plane_metric::plane<Field>::plane(const int str, const int coll, Field def) : plane(str, coll)
{
  clear(def);
}

Либо все перенесите в определение класса. Либо туда, либо туда.