параметр указателя на функцию с псевдонимом типа

я пробую несколько примеров в книге (c ++ primer от lippman) и
я пытаюсь узнать о функциональных указателях

этот код:

#include <iostream>

void useBigger (const std::string &s1, const std::string &s2,
bool (*func)(const std::string &, const std::string &))
{
bool valid = func (s1, s2);
std::cout << __func__ << " is called "<< valid <<std::endl;
}

bool lengthCompare (const std::string &s1, const std::string &s2)
{
if (s1.size() > s2.size())
return true;
else
return false;
}

int main()
{
useBigger ("hello", "sample", lengthCompare);return 0;
}

этот код работает нормально
но когда я пытаюсь использовать псевдоним типа, например typedef

#include <iostream>

typedef bool func (const std::string &, const std::string &); /// or typedef bool (*func)(const std::string &, const std::string);

void useBigger (const std::string &s1, const std::string &s2,
func)
{
bool valid = func (s1, s2);
std::cout << __func__ << " is called "<< valid <<std::endl;
}

bool lengthCompare (const std::string &s1, const std::string &s2)
{
if (s1.size() > s2.size())
return true;
else
return false;
}

int main()
{
useBigger ("hello", "hiiiii", lengthCompare);return 0;
}

выдает ошибку примерно так:

  error: expression list treated as compound expression in functional cast [-fpermissive]

2

Решение

Символ func это введите псевдоним, но вы используете это как функцию. Вы должны фактически объявить переменную аргумента и использовать ее вместо типа, например, например.

void useBigger (const std::string &s1, const std::string &s2,
func f)
{
bool valid = f (s1, s2);
std::cout << __func__ << " is called "<< valid <<std::endl;
}
4

Другие решения

Ваш тип определения нужно исправить следующим образом:

От

typedef bool func (const std::string &, const std::string);

К

typedef bool func (const std::string &, const std::string&);

А в функции useBigger вы должны передать тип функции с именем переменной и должны исправить определение функции следующим образом:

void useBigger (const std::string &s1, const std::string &s2,
func f)
{
bool valid = f (s1, s2);
std::cout << __func__ << " is called "<< valid <<std::endl;
}
0

По вопросам рекламы [email protected]