Проблема с конструктором шаблонов c

#c #templates #constructor

#c #шаблоны #конструктор

Вопрос:

код:

 #include<iostream>

using namespace std;

template<class T, int N> class point {
    T coordinate[N];
public:
    point(const point<T,N>amp;);
    const doubleamp; operator[](int i) const {
        return coordinate[i];
    }
};

template<class T, int N> point<T,N>::point(const point<T,N>amp;p)
{
    for(int i=0;i<N;i  )
        coordinate[i]=p.coordinate[i];
};

int main() {
    point<int,2> P2;
    point<double,3> P3;
    cout<<P2[0]<<P3[1];
    return 0;
}
  

вывод:

 prog.cpp: In function ‘int main()’:
prog.cpp:17: error: no matching function for call to ‘point<int, 2>::point()’
prog.cpp:11: note: candidates are: point<T, N>::point(const point<T, N>amp;) [with T =
             int, int N = 2]
prog.cpp:18: error: no matching function for call to ‘point<double, 3>::point()’
prog.cpp:11: note: candidates are: point<T, N>::point(const point<T, N>amp;) [with T =
             double, int N = 3]
prog.cpp: In member function ‘const doubleamp; point<T, N>::operator[](int) const [with
          T = int, int N = 2]’:
prog.cpp:19:   instantiated from here
prog.cpp:8: warning: returning reference to temporary
  

Пожалуйста, помогите мне разобраться в ошибках.

Ответ №1:

Сгенерированный компилятором конструктор по умолчанию не предоставляется, поскольку вы создали свой собственный конструктор. Поэтому, когда вы создаете P2 без аргументов для его конструктора, вам необходимо определить конструктор по умолчанию для его компиляции.

Комментарии:

1. (или удалите конструктор копирования — компилятор по умолчанию — при условии, что он в любом случае будет делать то же самое, по крайней мере, столь же эффективно)

2. Вам нужно только добавить конструктор по умолчанию в свой класс: point(){};

3. Это не единственная проблема. Оператор должен иметь тип возвращаемого значения T вместо double, я полагаю, и поскольку оператор возвращает const и является методом const, вы не можете присвоить значения координат, используя P2 [1] = 10; (поскольку в настоящее время нет другого метода для этого).

4. на самом деле я новичок в векторных и матричных вычислениях… мне нужно вычислить некоторую матрицу PDE .. но все же я learning..do у вас есть какие-либо предложения по изучению шаблона, списка для векторных, матричных вычислений?

Ответ №2:

Когда вы объявляете переменную что-то вроде,

 point<int,2> P2;
  

Он использует конструктор по умолчанию; его можно использовать в 2 сценариях:

  1. Вы не объявили НИКАКОГО конструктора в теле вашего класса. Таким образом, компилятор автоматически сгенерирует шаблон по умолчанию, и вы сможете его использовать.
  2. Вы явно объявляете / определяете конструктор по умолчанию (будь он пустым, если вы ничего не делаете)

Поскольку здесь вы ничего не делаете: просто объявляете пустой конструктор по умолчанию:

 template<class T, int N> class point {
//...
public:
  point() {}  // <-- default constructor
};
  

Это устранит ваши ошибки.

Также есть важное предупреждение:

 prog.cpp:8: warning: returning reference to temporary
  

Это из-за вашего operator [] .
Измените строку,

 const doubleamp; operator[](int i) const
  

Для,

 const Tamp; operator[](int i) const  // for <int, N> you should return 'int' not 'double'
  

Ответ №3:

Проблема в том, что с этими двумя строками

 point<int,2> P2;
point<double,3> P3;
  

вы пытаетесь создать два «точечных» объекта с помощью конструктора без параметров по умолчанию.

Однако этот конструктор не создается автоматически, если вы не укажете какие-либо другие. Реализация конструктора по умолчанию решит вашу проблему

Комментарии:

1. сэр, это коды из книги. я не знаю, почему он не запущен? однако не могли бы вы дать мне исправленный код?