LINUX.ORG.RU

Странная ошибка c шаблоном (или я идиот, или одно из двух)

 , ,


1

2
#include <cfloat>
#include <cstdint>
#include <cstddef>
#include <complex>

typedef uint8_t                u8;
typedef float                  f32;

template<u8 nd>
struct grid_t {

	struct node_t {

		template<u8 order>
		u8 get_form (f32 *form, u32 *ptidx, f32 *ptpos) const {
			u8 flag{0};
			return flag;
		}
	};

	node_t operator [] (u32 k) const {
		return {};
	}
};

template<u8 nd, u8 order>
void run_ppush
(const grid_t<nd> &grid) {
		auto node   = grid[0];
		u8 flag{node.get_form <order> (nullptr, nullptr, nullptr)};
// error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘unsigned char’ to binary ‘operator<’
// 38 |                 u8 flag{node.get_form <order> (nullptr, nullptr, nullptr)}; 
//WAT...
}

void ppush1_1_fn
(const grid_t<1> &grid) {
	return run_ppush<1, 0>(grid);
}
★★★★★

Последнее исправление: thunar (всего исправлений: 5)

Кстати, шланг даёт диагностику с подсказкой:

$ clang++ -c 1.cc 
1.cc:36:35: warning: left operand of comma operator has no effect [-Wunused-value]
   36 |                 u8 flag{(node.get_form <order> (nullptr, nullptr, nullptr))};
      |                                                 ^~~~~~~
1.cc:36:44: warning: left operand of comma operator has no effect [-Wunused-value]
   36 |                 u8 flag{(node.get_form <order> (nullptr, nullptr, nullptr))};
      |                                                          ^~~~~~~
1.cc:36:17: error: missing 'template' keyword prior to dependent template name 'get_form'
   36 |                 u8 flag{(node.get_form <order> (nullptr, nullptr, nullptr))};
      |                               ^
1.cc:44:9: note: in instantiation of function template specialization 'run_ppush<(unsigned char)'\x01', (unsigned char)'\x00'>' requested here
   44 |         return run_ppush<1, 0>(grid);
      |                ^
2 warnings and 1 error generated.
wandrien ★★
()
Ответ на: комментарий от anonymous

во всяких журналах «радио», «моделист конструктор» итд

весь материал давался с маленькой неточностью

что бы повторяющий сам смог понять и исправить)))

так что я по привычке

anonymous
()

invalid operands of types ‘’ and ‘unsigned char’ to binary ‘operator<’

Вот этот код:

u8 flag{node.get_form <order> (nullptr, nullptr, nullptr)};

Похоже пытается сделать что-то такое:

node.get_form < order

Вроде так можно понять эту ошибку.

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

Ну всратый синтаксис это основа основ, заложенная Ритчи. Кресты продолжают путь праоснователя, можно сказать.

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

Я тут думаю, что с этим делать, если бы гипотетически кто-то дизайнил синтаксис с нуля. И единственное, что мне приходит на ум, это воспользоваться путём фортрана и бейсика — использовать круглые скобки для индексации массива вместо квадратных.

Тогда один вид скобок освободился бы конкретно под шаблоны.

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

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

thunar ★★★★★
() автор топика
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от thunar

Ничего страшного в твоем кейсе нет, подумаешь, один дополнительный template дописать надо. Объективно, ты просто вредничаешь как девчёнка

anonymous
()