я пробую несколько примеров в книге (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]
Символ 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;
}
Ваш тип определения нужно исправить следующим образом:
От
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;
}