2010-01-21 4 views
2

예, 제목이 아기를 놀라게 할 수는 있지만 실제로는 매우 간단합니다.다양성 매개 변수가있는 인수없는 템플릿 함수를 액세스하는 모호한 오버로드

I 즉, 전문 템플릿 함수에 함수 포인터를 저장하기 위해 노력하고 부스트 : 도시 된 바와 같이 (1.41 부스트) make_shared :

boost::shared_ptr<int> (*pt2Function)() = boost::make_shared<int>; 

그러나,이 컴파일되지 않습니다 (GCC 4.4.1)에 의한 부스트 :: make_shared 컴파일러는 이러한 맥락에서 떨어져 말할 수있는 다음과 같은 두 가지 전문 분야를 가지고 있다는 사실에 :

template< class T > boost::shared_ptr<T> make_shared() 
... 
template< class T, class... Args > boost::shared_ptr<T> make_shared(Args && ... args) 

오류, 참조 :

In function ‘int main()’: 
error: converting overloaded function ‘make_shared’ to type ‘class boost::shared_ptr<int> (*)()’ is ambiguous 
boost/smart_ptr/make_shared.hpp:100: error: candidates are: boost::shared_ptr<X> boost::make_shared() [with T = int] 
boost/smart_ptr/make_shared.hpp:138: error:     boost::shared_ptr<X> boost::make_shared(Args&& ...) [with T = int, Args = ] 

변수가 아닌 유사 콘텐츠를 주석 처리하면 코드가 올바르게 컴파일됩니다.

아무도이 같은 두 개의 인수가없는 함수 사이의 모호성을 해결하기위한 적절한 구문을 알고 있습니까?

+0

어떤 정확한 부스트 버전을 사용하고 있습니까? –

+0

부스트 버전 1.41. 질문에 추가했습니다. – porgarmingduod

+0

좋아, 그동안 아무도 그렇게하지 않으면 나는 일 후에 티켓을 열어. –

답변

2

가변 인수 템플릿 인수는 0..n 템플릿 인수를 사용하므로 두 버전이 모두 일치한다는 것을 의미합니다.
다른 템플릿 매개 변수를 두 번째 버전에 추가하여 모호성을 해결할 수 있으므로 1.n 인수가 필요합니다. 이 같은
뭔가 작동합니다 : UncleBens 올바르게 지적

template< class T, class Arg1, class... Args > 
boost::shared_ptr<T> make_shared(Arg1&& arg1, Args && ... args) 

하지만, 당신도 두 가지 버전이 필요하지 않습니다. 귀하의 경우에 충분해야 다음

template< class T, class... Args > 
boost::shared_ptr<T> make_shared(Args && ... args); 

당신은 단지 하나 개의 템플릿 인수 (즉 T)를 사용하는 경우, 당신은 make_shared()의 0 인수 버전을.

+2

처음에는 왜 과부하가 필요한지 알 수없는 것처럼 보입니다. 제로 논쟁을 "전달"할 수 있습니까? – UncleBens

+0

좋은 지적. 내가 방금 추가 했니? –

+0

물론. 그러나 이러한 기능은 부스트 ​​라이브러리의 최신 버전에서 제공됩니다. 아마도 그들은 결함에 대한 정보를 받아야할까요? – UncleBens