2015-06-28 2 views
2

им пытаются несколько примеров в книге (с ++ грунтовку Липпманом) и им пытаются узнать о функциональных указателейфункция параметра указатель с типом псевдоним

этот код:

#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; 
} 

этот код просто прекрасно работает но когда я попробовать использовать псевдоним типа, такие как ЬурейеЕ

#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] 
+0

«этот код просто отлично работает» - um no it not. Вы никогда не закрывали список параметров вашей функции. Вам не хватает ')'. – WhozCraig

ответ

4

Символ 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; 
     } 
+0

так что в принципе func - это тип пользователя? –

+0

@ KrysselTillada Это псевдоним для типа и используется как любой другой тип. –

+0

О, я понимаю спасибо –

0

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

От

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; 
      } 
Смежные вопросы