Проблема с конструктором шаблонов c ++ - PullRequest
4 голосов
/ 20 мая 2011

код:

#include<iostream>

using namespace std;

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

template<class T, int N> point<T,N>::point(const point<T,N>&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>&) [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>&) [with T =
             double, int N = 3]
prog.cpp: In member function ‘const double& 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

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

Ответы [ 3 ]

5 голосов
/ 20 мая 2011

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

1 голос
/ 20 мая 2011

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

point<int,2> P2;

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

  1. Вы не объявили конструктор ANY в своем теле класса.Таким образом, компилятор сгенерирует стандартный по умолчанию автоматически, и вы можете использовать его.
  2. Вы явно / объявляете / определяете конструктор по умолчанию (будь он пуст, если вы ничего не делаете)

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

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

Это очистит ваши ошибки.

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

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

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

const double& operator[](int i) const

На,

const T& operator[](int i) const  // for <int, N> you should return 'int' not 'double'
0 голосов
/ 20 мая 2011

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

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

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

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

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