2011-01-03 9 views
6

다음 코드 C++에서 오버로드 연산자() 나를 위해 작동 :회원 기능 템플릿과

class Foo { 
public: 
    template <class T> T& get() { ... } 
}; 

Foo foo; 
foo.get<int>() = ...; 

을하지만, 다음 코드는 나를 위해 작동하지 않습니다

class Foo { 
public: 
    template <class T> T& operator()() { ... } 
}; 

Foo foo; 
foo<int>() = ...; 

오류를 인 :

expected primary-expression before '>' token 
expected primary expression before ')' token 

두 오류는 foo<int>()

참조

왜 이것이 작동하지 않으며이를 해결할 수 있습니까? 명시 적으로 템플릿 인수를 지정해야하는 경우

+1

'operator()'템플릿은 인스턴스화가 반환 값에 대해서만 과부하가되기 때문에 꽤 쓸모가 없습니다. 'get' 등의 이름을 사용하십시오. – aschepler

+0

사용할 수 없습니다 (바람직하지 않을 수도 있음). 아래 답변을 참조하십시오. –

+0

왜 클래스 전체가 아니라 함수를 templatize하고 있습니까? –

답변

10

, 당신은 operator 구문을 사용해야합니다 :

foo.operator()<int>() 

함수 호출 구문을 사용하여 인수를 지정할 수있는 방법이 없습니다. 함수에 대한 인수에서 템플릿 인수를 추론 할 수없는 경우 연산자 오버로드보다 멤버 함수를 사용하는 것이 좋습니다.

+0

아, 정말로 감사합니다. 지금은 의미가 있습니다. – Dan

-1

은 또는 당신이

class Foo { 
public: 
    template <class T> operator T&() { ... } 
}; 

그런 다음 자동으로 "반환"유형에 따라 적절한 함수를 호출 할 수있는 :

Foo foo; 
int i=foo; 

나는 대부분의 사람들이 같은이 마음에 들지 것을 알고있다 호출되는 함수는 반환 형식에 따라 다르지만 구문을 정리하는 위대한 "트릭"을 찾습니다.

+3

추가 경고 : 의도하지 않은 유형의 "변환"방법을 실수로 쉽게 인스턴스화 할 수 있습니다. – aschepler

+2

나는 이것이 코드를 지나치게 복잡하게 만드는 트릭이라고 생각합니다. * 모든 유형의 변환 연산자를 제공 했으므로 예상하지 못하거나 실현하지 못할 가능성이 가장 적은 곳에서 귀하를 공격 할 것입니다. –

1

문제는 템플릿 매개 변수 목록의 위치가 잘못되었습니다. 마치 템플릿 인수 int과 함께 foo이라는 객체 나 함수를 사용하려고하는 것과 같습니다. 실제로는 템플릿 매개 변수 목록을 표시 할 operator()입니다.

불행히도 (논증 할 수 있듯이, 최소한),이 문제를 해결할 수있는 방법은 없습니다. 다음과 같이 전체 기능으로 호출해야합니다.

class Foo { 
public: 
    template <class T> T& operator()() { ... } 
}; 

Foo foo; 
foo.operator()<int> = ...; 

희망이 있습니다.