C ++ шаблоны и неподписанные длинные проблемы - PullRequest
1 голос
/ 04 марта 2011

Я собираюсь сделать константу Vector

const  madness::Vector<double,3> kvec(0.0, 0.0, 1.0);

. Вызвав следующий код

template <typename T>
Vector<T,3> vec(T x, T y, T z) {
   Vector<T,3> r; r[0] = x; r[1] = y; r[2] = z;
   return r;
}

К сожалению, я получаю сообщение об ошибке

extra.cc:216: error: no matching function for call to ‘madness::Vector<double, 3ul>::Vector(double, double, double)’
note: candidates are: madness::Vector<T, N>::Vector(const madness::Vector<T, N>&) [with T = double, long unsigned int N = 3ul]
note:                 madness::Vector<T, N>::Vector() [with T = double, long unsigned int N = 3ul]

Не могу не заметить 3ul в сообщении об ошибке.Почему компилятор думает, что моя маленькая невинная тройка - беззнаковая длинна?

Заранее спасибо, Ник

Ответы [ 4 ]

2 голосов
/ 04 марта 2011

Если вы хотите использовать функцию vec, вам нужно сделать

const  madness::Vector<double,3> kvec( vec(0.0, 0.0, 1.0) );

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

2 голосов
/ 04 марта 2011

- это ваш шаблон класса Vector, возможно:

template<typename T, size_t N> class Vector ...

А ваш size_t, возможно, длинная без знака?

Кроме того, я подозреваю, что вы действительно имели в виду:

const  madness::Vector<double,3> kvec = vec(0.0, 0.0, 1.0);
0 голосов
/ 04 марта 2011

Добавить конструктор, который принимает три три входа.Вот так:

template <unsigned int T, class N>
class Vector {
public:
  // ...
  Vector(T x, T y, T z);
  // ..
};
0 голосов
/ 04 марта 2011

Добавить конструктор, который занимает 3 двойных. У вас его еще нет, или вы объявили его неправильно, или вместо конструктора вы хотите использовать агрегатную инициализацию, используя = { ... }. Выберите то, что подходит.

Что касается 3u - вы, скорее всего, объявили соответствующий параметр шаблона как unsigned long int.

Обратите внимание, что это имеет важное значение

template<typename T, int N>
void f(Vector<T, N> v);

// will not work, since "N" is an int, not an "unsigned long int"!
f(kvec);

Вам необходимо знать точный тип параметра шаблона нетипичного типа, чтобы иметь возможность выводить аргументы. В этом случае вам потребуется N, чтобы быть unsigned long int.

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