2012-07-25 3 views
0

기본에서 C++을 배우려고합니다. 함수 포인터를 가지고 놀았습니다. 내가 잘못 뭐하는 거지인수가 너무 많고 함수 포인터의 인수가 너무 적습니다.

main.cpp:28 (*): error: too few arguments to function

main.cpp:32 (**): error: too many arguments to function

:

#include <iostream> 
#include <string> 
#include <vector> 

bool print(std::string); 
bool print(std::string a) 
{ 
    std::cout << a << std::endl; 
    return true; 
} 

bool call_user_function(bool(std::string), std::vector<std::string>); 
bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) { 
    if (args.size() == 0) 
     return (*p)();     (*) 
    else if (args.size() == 1) 
     return (*p)(args[0]); 
    else if (args.size() == 2) 
     return (*p)(args[0], args[1]); (**) 
} 

int main(int argc, char** argv) 
{ 
    std::vector<std::string> a; 
    a[0] = "test"; 
    call_user_function(print, a); 
    // ok 
    return 0; 
} 

그것은 나를 제공 :이 코드를 고려?

+0

벡터에 요소가 없기 때문에'a [0] = "test"'가 잘못되었습니다. 그것이 적어도 하나를 포함한다면 그것은 효과가있을 것이다. – GManNickG

+0

관련이 없지만 정의 바로 앞에 오는 함수 선언은 아무 것도 수행하지 않습니다. –

+0

@GManNickG, 오, 'push_back()'을 사용해야하나요? – Shoe

답변

3

pbool(*)(std::string)입니다. 즉, std::string 유형의 단일 매개 변수가있는 함수에 대한 포인터이며 bool을 리턴합니다. 이 유형 std::string의 단일 매개 변수를 가지고 있으며 bool을 반환하는 함수입니다 : print 일치의 유형이 있기 때문에

p

print를 가리킬 수 있습니다.

첫 번째 잘못된 표현 인 (*p)()은 인수없이 p을 호출하려고 시도합니다. 두 번째 잘못된 표현 인 (*p)(args[0], args[1])은 두 개의 인수를 사용하여 p으로 전화를 시도합니다.

인수의 개수는 매개 변수의 개수와 일치해야하므로 print을 인수없이 직접 호출하거나 두 개의 인수로 호출하면 컴파일 오류가 발생하는 것처럼 이러한 두 인수는 모두 형식이 잘못되었습니다.

+0

아 맞다. 바보 나. bool을 반환하지만 여러 인수를 가질 수있는 포인터가되도록 만드는 방법이 있습니까? – Shoe

+0

당신이하고 싶은 것에 따라 달라집니다 :'print'는 하나의 인자만을 허용합니다. 여러 인자들을'print'하는 것은 무엇을 의미할까요? 그 행동이 무엇을 기대합니까? 하나의 옵션은'call_user_function' _ 사용자 _ 함수를 각 인수에 적용하는 것입니다 : 개별 인수에 대해 한 번 사용자 함수를 호출하십시오. –

+0

모든 함수를 호출하고 매개 변수를 전달할 수있는'call_user_function'의 PHP 동작을 시뮬레이트하고 싶습니다. 그래서 나는 bool을 반환하고'std :: string'을 매개 변수로 (그리고 벡터를 통해 전달할 수있는) 모든 함수를 호출 할 수있는'call_user_function()'을 만들 수 있기를 원합니다. – Shoe

0

print은 인수가없는 호출에 과부하가 없습니다.

print도 두 개의 std::string 인수에 대한 과부하가 없습니다.

+0

Nooo, 너무 늦었 어. :) – Aesthete

1

@JamesMcNellis가 이미 코드 문제를 해결했습니다.

이 일 같은 것을 만들려면, 당신은 아마 같은 것을하고 싶지 :

bool call_user_function(bool(*p)(std::string), std::vector<std::string> args) { 
    bool ret = true; 
    for (int i=0; i<args.size(); i++) 
     ret &= p(args[i]); 
    return ret; 
} 

을 ... 나, 당신이 표준 : : for_each를 사용할 수 (당신이 어떻게 든 사용하지 않을 때문에, I ') 순간의 반환 값을 무시하는 것이다 :

: 당신은 그냥 벡터의 내용을 인쇄하고 있기 때문에,

// avoid copying vector by passing reference to const vector. 
void call_user_function(bool (*p)(std::string), std::vector<std::string> const &args) { 
    std::for_each(args.begin(), args.end(), p); 
} 

을 ...하지만, 당신이 아마 사용해야하는 것은 더이 같은 것입니다

std::copy(a.begin(), a.end(), 
      std::ostream_iterator<std::string>(std::cout, "\n")); 

a[0] = "test";은 유효하지 않습니다. 대신 을 원합니다.

관련 문제