Параметры по умолчанию в шаблонных функциях (C ++) - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь использовать параметры по умолчанию в функции шаблона.Ниже приведен минимальный пример того, что я пытаюсь сделать:

В sort.h

template <typename T0, typename T1>
void sort(Vector<T0> &v0,Vector<T1> &v1=0)
{
    //sort v0, if (v1 != 0) sort it according to v0
}

В main.cpp

#include "sort.h"
Vector<int> v0;
sort(v0);

Это не компилируется;компилятор выдает ошибку «нет подходящей функции для вызова sort».

В основном эта функция должна сортировать вектор v0 (произвольный тип данных).Кроме того, в качестве параметра может быть задан второй вектор v1 (произвольный), который сортируется так же, как вектор v0.Конечно, я мог бы решить эту проблему, просто используя перегруженные функции, но, поскольку я хотел бы расширить список дополнительных векторов до 5, мне потребуются сотни различных функций.

Обновление: Спасибо за ваши ответы.Я изменил свое описание проблемы, чтобы дать вам лучшее представление о том, что я пытаюсь сделать.

Ответы [ 6 ]

8 голосов
/ 09 декабря 2010

Ссылка не может указывать ни на что.

6 голосов
/ 09 декабря 2010

Вы не можете использовать по умолчанию ссылку на 0. Вы должны использовать указатели для этого (если вы настаиваете).

Компилятор также не может интуитивно понять, что такое T1 без фактического Vector<X> для работы. Конкретный тип параметра был бы необходим для параметра 2. Если бы вторым параметром был, например, Vector<T0>*, это было бы нормально, поскольку тип можно было бы определить из параметра 1 (который не является значением по умолчанию). В противном случае вам придется указывать параметры шаблона при каждом вызове testfunction.

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

2 голосов
/ 09 декабря 2010

Я бы просто перегрузил функцию.

template <typename T0, typename T1>
void sort(Vector<T0> &v0,Vector<T1> &v1)
{
    //do something
}
void sort(Vector<T0> &v0)
{
    //do something
}
1 голос
/ 09 декабря 2010

Только потому, что вы задаете значение по умолчанию для второго аргумента в testfunction, компилятор не имеет возможности получить T1, если вы не дадите ему что-то для продолжения.Вам необходимо явно указать тип.Что-то вроде:

testfuntion<int, float>(v0);

Кроме того, как уже отмечали другие, вам нужно найти какой-то способ правильно объявить второй аргумент, так как ссылка не может иметь «нулевое» значение.Мне лично нравится таким образом .

1 голос
/ 09 декабря 2010

Я бы предпочел

template <typename T0, typename T1>
void testfunction(Vector<T0> &v0,const Vector<T1> &v1 = Vector<T1>() )
{
    //do something
}
0 голосов
/ 09 декабря 2010

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

template <typename T0, typename T1>
void testfunction(Vector<T0>* v0, Vector<T1>* v1 = 0)
{
    //do something
}
...