LINUX.ORG.RU

Шаблоны функций(C++)


0

0

Задача из книги Страуструпа.
Создать вектор классов Record c членами Price и Count
Отсортировать его по каждому члену с помощью шаблона функций.Критерий сортировки определяется по параметру шаблона.
Всё предельно просто,даже для меня.Но компилятор выкидыает вот такое при компиляции.

sort.h:7: error: default template arguments may not be used in function templates

т.е. ругается на определение шаблона функции:

template<class T,class C=cmp > bool sort(std::vector<T>& vec );

и , короче , ни фига не понимаю.
Спасибо всем , кто отклинется.

★★★

А значения _параметров функции_ по умолчанию не помогут?

Begemoth ★★★★★
()
Ответ на: комментарий от dissident

Что-то никак не могу найти почему deafult аргументы в шаблоне _функции_ нельзя, но практика показывает что объяснение будет таким же идиотичным как в случае с shade'ингом или невозможностью сгенерировать копирующий конструктор для класса со ссылкой или для необходимости иметь виртуальный деструктор в случае переопределения delete или что при понижающем dynamic_cast типы должны быть полимофрмы и т.д. и т.п. Мерзкий язык.

dissident ★★
()
Ответ на: комментарий от kitov

Бред какой-то. Посмотри 13.4.1 втрой пример с compare, там Труп совершенно беззаботно использует аргумент по умолчанию при декларации/девиниции функции. С другой стороны в нете можно найти упоминания о том, что так нельзя и кроме того sort() тоже так там не задекларирован. Короче ХЕЗ.

dissident ★★
()
Ответ на: комментарий от dissident

Видимо аргумент по умолчанию можно использовать только с классами шаблонами.
Но как Страуструп мог так лохануться ?
Ещё удивляет молчание бесчисленых специалистов ЛОРа.

kitov ★★★
() автор топика
Ответ на: комментарий от kitov

> удивляет молчание бесчисленых специалистов ЛОРа.

Судя по соседним топикам, специалисты ЛОРа, наконец-то вняли увещеваниям Луговского и толпой бросились учить OCaml, Haskell, Common Lisp и elisp :)

watashiwa_daredeska ★★★★
()

14.1/9
...
A default templateargument
shall not be specified in a function template declaration or a function template
definition, nor in the templateparameterlist
of the definition of a member of a class template.
...

почему так все - не могу 100% точно ответить, но скорее всего буддут проблемы с function overloading/partial ordering.
там и так все ну очень заморочено сейчас, может быть решили просто не усложнять все еще дальше. ниасилили короче :)

AnToXa
()
Ответ на: комментарий от AnToXa

Будем счиать за косяк Страуструпа.
В "Философия C++" написано,что аргументы по умолчанию только классов,не для функций.
Считаем тему закрытой.

kitov ★★★
() автор топика
Ответ на: комментарий от kitov

Вообще Труп по-моему описывает какой-то абстрактный язык. Посмотри в разделе о bitset пример вызова специализированного шаблона члена без аргментов:

class A {
public:
template<class T> wtf() { /*...*/ }
}

Труп утверждает (там и где-то в B.13.6 чтоли) что нужно это чудо вызывать так:

A a;
a.template wtf<int>();

А такие радости в g++ например не проходят.. Без template проходят.

dissident ★★
()
Ответ на: комментарий от dissident

template нужен когда вы вызываете шаблонную функцию у типа, являющегося или зависящего от параметра шаблона.

пример:

#include <cstdio>

struct Test {
	template<class T> void foo() const {
		printf("%s\n", __PRETTY_FUNCTION__);
	}
};

template<class T>
void call_foo(T const& t) {
	t.template foo<int>();
}

int main() {

	Test t;

	t.foo<int>(); // вот без template

	call_foo(t); // а вот внутри этой функции - с template
	
	return 0;
}

AnToXa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.