Проблемы с шаблоном: нет подходящей функции для вызова - PullRequest
1 голос
/ 15 июня 2010

Я пытаюсь создать шаблонный класс, и когда я определяю не шаблонную функцию, не являющуюся членом, я получаю ошибку «Нет подходящей функции для вызова randvec ()».

У меня есть шаблонкласс, определенный как:

template <class T>
class Vector {
T x, y, z;

public:
//constructors
Vector();
Vector(const T& x, const T& y, const T& z);
Vector(const Vector& u);

//accessors
T getx() const;
T gety() const;
T getz() const;

//mutators
void setx(const T& x);
void sety(const T& y);
void setz(const T& z);

//operations
void operator-();
Vector plus(const Vector& v);
Vector minus(const Vector& v);
Vector cross(const Vector& v);
T dot(const Vector& v);
void times(const T& s);
T length() const;
//Vector<T>& randvec();

//operators
Vector& operator=(const Vector& rhs);
friend std::ostream& operator<< <T>(std::ostream&, const Vector<T>&);
};

, и рассматриваемая функция, которую я определил после всех этих функций выше:

//random Vector
template <class T>
Vector<double>& randvec()
{
const int min=-10, max=10;
Vector<double>* r = new Vector<double>;
int randx, randy, randz, temp;

const int bucket_size = RAND_MAX/(max-min +1);

temp = rand();    //voodoo hackery

do randx = (rand()/bucket_size)+min;
while (randx < min || randx > max);
r->setx(randx);

do randy = (rand()/bucket_size)+min;
while (randy < min || randy > max);
r->sety(randy);

do randz = (rand()/bucket_size)+min;
while (randz < min || randz > max);
r->setz(randz);

return *r;
 }

Тем не менее, каждый раз, когда я вызываю ее в своемОсновная функция с использованием строки вроде:

    Vector<double> a(randvec());

Я получаю эту ошибку.Однако, если я удаляю шаблон и определяю его, используя 'double' вместо 'T', вызов randvec () работает отлично.Почему он не распознает randvec ()?

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

1 Ответ

9 голосов
/ 15 июня 2010

Вы определили randvec как шаблон функции, но никакие параметры функции не зависят от параметра шаблона T (на самом деле randvec вообще не имеет параметров функции). Это сразу означает, что компилятор не может вывести аргумент шаблона T из вызова randvec(). Вы должны явно указать аргумент шаблона T для каждого вызова randvec, как в

randvec<some_type>()

или, в вашем контексте

Vector<double> a( randvec<some_type>() );

Это фактически поднимает вопрос о том, почему вы решили определить randvec как шаблон функции, когда ничто в randvec фактически не зависит от параметра шаблона T. Почему?

P.S. Возвращение динамически размещенного объекта по ссылке ... Его можно заставить работать правильно, но это все еще очень сомнительная практика. Я не вижу весь ваш код, но я предполагаю, что ваш

Vector<double> a( randvec<some_type>() );

утечки Vector<double> объект выделен и возвращен randvec.

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