이 C++ 문을 어떻게 해석해야 할까요?
글쓴이: 최종호 / 작성시간: 화, 2008/07/08 - 12:32오전
int main(int argc, char **argv) { vector<int> vec; vec.push_back(3); vec.push_back(1); vec.push_back(2); sort(vec.begin(), vec.end(), greater<int>()); }
greater<int>() 부분을 어떻게 이해해야 할지 모르겠습니다.
심정적으로는 greater<int> 의 function object가 들어가야 할 부분이므로 greater<int>의 temporary object를 생성하는 것으로
생각이 되는데,
파라메터를 받는 constructor 가 있는 경우에는
SomeFunctionClass(1, 3, 4) 와 같은 식으로 해 주는데, 없는 경우에는 왜 괄호를 붙여주는 것일까요?
변수 정의 방식과 연결시켜서 생각해 보려고 해도 잘 안되네요.
SomeFunctionClass sfc(1, 3, 4); OtherFunctionClassWithNoParam ofc;
이걸 그대로 병치시켜보면
sort(vec.begin(), vec.end(), SomeFunctionClass(1, 3, 4)); sort(vec.begin(), vec.end(), OtherFunctionClassWithNoParam);
와 같이 하는 것이 맞을 것 같으면서도, 또 한편 생각해 보면
함수 호출시에 아래처럼 오브젝트가 아닌 타입을 넘기는 것과 비슷한 느낌이라서 안 맞는 것 같기도 합니다.
f(1, 4, OtherFunctionClassWithNoParam);
추가질문으로, 위 소스를
sort(vec.begin(), vec.end(), greater<int>);
와 같이 수정해서 컴파일을 하면 <int> 다음의 괄호의 위치에서
g++ q.cc q.cc: In function 'int main(int, char**)': q.cc:18: error: expected primary-expression before ')' token
와 같은 오류가 발생합니다. 이게 g++ 이 에러때문에 바보가 되어서 에러 원인을 잘못 파악한 것일까요?
아니면 정말 뭔가 알고서 낸 에러메시지일까요?
Forums:
생성자호출입니다.
생성자호출입니다.
생성자도 함수이고, 인자를 받지 않더라도 ()가 있어야합니다.
말씀하신대로 ()가 없다면 그냥 타입을 넘겨주는 게 되버리구요.
OtherFunctionClassWithNoParam ofc;
여기서 ofc를 선언할때 괄호를 안치는 걸로 이상하다고 말씀하시는 것 같은데, 저렇게 선언을 하면 자동으로 컴파일시에 OtherFunctionClassWithNoParam()을 호출합니다.
만약에 생성자에 OtherFunctionClassWithNoParam()가 없다면 컴파일에러가 발생하구요.
OtherFunctionClassWithNoParam ofc(); 와 동일합니다.
네, 역시
네, 역시 생성자호출이었네요.
OtherFunctionClassWithNoParam ofc(); 은 default constructor를 이용해서 OtherFunctionClassWithNoParam 객체를 생성하는 것이 아니라
input parameter가 지정되지 않고 OtherFunctionClassWithNoParam 를 리턴하는 함수 ofc 를 선언하는 것으로 알고 있습니다.
추가 질문....
전자로 해석되지 않고 후자로 해석되게 하는 문법상의 규칙이 어떤건가요?
해당 상황에서
해당 상황에서 해석이 모호한 경우 항상 함수 정의로 해석하는 규칙이 있습니다. 정확히 표준 어디에 있는지는 잘 모르겠군요.
댓글 달기