2017-10-11 20 views
0

this 질문 나는 functor (함수 객체)에 대해 잘 알고 있습니다. 초기화하고 호출하는 방법. 나는 의견의 일부에서 위의 질문에서보고 다음과 같은 컴파일 오류왜 std :: transform에서 함수 객체 인수를 사용하지 않고 대신 람다 표현식을 사용해야합니까

Severity Code Description Project File Line Suppression State 
Error C2064 term does not evaluate to a function taking 1 arguments 

을 내 자신의 이해

class Foo 
{ 
private: 
    int x; 
public: 
    Foo(int x) : x(x) {} 
    int operator()(int y) { return x + y; } 
}; 

Foo poo(50); 

int a = poo(50); 

std::cout << a; 

std::vector<int> vec(10); 
std::vector<int> pec(10); 

std::transform(vec.begin(), vec.end(), vec.begin(), poo(1)); 

이 놀러받을 몇 가지 코드를 작성하는 대신 람다 식을 시도 허용 대답이 std::transform(in.begin(), in.end(), out.begin(), add_x(1));를 사용하는 이유 작동

std::transform(vec.begin(), vec.end(), vec.begin(), [](Foo poo) {return poo(1); });

하지만 이해가 안 돼요 실패합니다. 왜 람다 표현식을 사용해야합니까? 또 다른 대답은 똑같은 일을하지만 여전히 컴파일 오류가 발생합니다. 왜 그런가요?

+9

오타처럼 들립니다. 'poo (1)'->'Foo (1)'. –

+0

나는 오해의 소지가있는 약간의 오류 메시지가 더 존재한다고 생각한다. 존재하지 않는 것을 참조하고 있다는 사실을 놓치게 만든다. –

+1

'poo (1)'은'int'입니다; 오류 메시지가 말하듯이, 1 인수를 취하는 함수가 아닙니다. 'Foo (1)'은'int' 형의 단일 인수를 취하는'operator()'함수 객체입니다. –

답변

3

이 코드는 정상적으로 작동합니다.

#include <iostream> 
#include <array> 

class add_x 
{ 
private: 
    int x; 

public: 
    add_x(int x) : x(x) {} 

    int operator()(int y) /* consider adding const here */ 
    { return x + y; } 
}; 


int main() 
{ 
    std::array<int, 5> input { 1, 4, 9, 16, 25 }; 
    std::array<int, 5> output; 
    std::transform(begin(input), end(input), begin(output), add_x(1)); 
    for (auto& val : output) std::cout << val << "\n"; 
} 

그러나, 아마는 펑터를 변이하지 않기 때문에 호출 const 멤버 함수를 확인하는 것이 좋습니다. 또한 표준 라이브러리의 다른 버전에서도 작동 할 수 있습니다.

이 버전과 람다 버전의 차이점은 여기에서 상수 1이 생성자에 전달되어 하나의 Functor 객체를 만들고 데이터가 해당 단일 Functor 인스턴스의 연산자에 순차적으로 전달된다는 것입니다. 람다에서는 변환 생성자를 호출하여 각 데이터에서 새로운 객체를 만든 다음 상수를 연산자에 전달합니다. 즉, xy이 대안으로 교체되고 인스턴스 수가 변경되었습니다.

Foo poo(1); 

단지 (1) 호출하지 않고, 변환에 똥을 보내 : 당신이 정의를 추가하는 경우

1

는 또한 작동합니다. Transform은() 연산자가있는 객체를 호출해야하며 별도로 선언하면 범위가 무엇인지 명확하게 알 수 있습니다.

+0

예,'Foo poo (1)'을 정의한 다음'poo' 변환기로 전달하십시오. 좋은 생각. – Mushy