2013-12-09 5 views
4

먼저이 질문이 내 첫 번째 stackoverflow 질문임을 지적해야하므로 나와 함께 부담하십시오.오버로드 된 함수 모호성

C++에서 함수 오버로드 중 일부 문제가 있습니다. 나는 다음과 같은 프로토 타입으로 함수를 만들려고 해요 :

void push_at_command(std::string, std::vector<std::string>, int); 

void push_at_command(std::string, std::vector<std::string>, std::vector<std::string>, int); 

void push_at_command(std::string, std::vector<std::string>, std::vector<std::string>, std::vector<std::string>, int); 

void push_at_command(std::string, std::vector<std::string>, bool, int); 

내가 원래 마지막 과부하 (부울로 한) 대신 문자열 벡터의 부스트 :: 정규식을 수용하기를 원했다;

void push_at_command(std::string, boost::regex, int); 

하지만, 그래서 그냥 빨리 내가 ​​플래그를 적용하고 정규식을 저장하는 벡터의 첫 번째 요소를 사용하여 프로토 타입을 추가 거라고 생각 '작업'코드를 얻을 수 ... 모호성 오류로 실행 문자열,하지만 나는 비슷한 문제로 부울을 실행하는 것 같습니다.

내가 이러한 다양한 오버로드를 호출하기 위해 노력하고있어 방법은 다음과 같습니다

push_at_command(
    "AT?S", 
    boost::assign::list_of("(\\d{3}.\\d{3})"), 
    true, 
    0); 
push_at_command(
    "AT?S", 
    boost::assign::list_of("L11")("L12"), 
    0); 
push_at_command(
    "AT?S", 
    boost::assign::list_of("L11"), 
    boost::assign::list_of("L21")("L22"), 
    0); 

을 그리고 이것은 내가지고있어 오류입니다 :

error: call of overloaded ‘push_at_command(const char [5], boost::assign_detail::generic_list<char [4]>, boost::assign_detail::generic_list<char [4]>, int)’ is ambiguous 
note: candidates are: 
note: void push_at_command(std::string, std::vector<std::basic_string<char> >, std::vector<std::basic_string<char> >, int) 
note: void push_at_command(std::string, std::vector<std::basic_string<char> >, bool, int) 

... 세 번째 기능 관련 요구.

그냥 bool로 오버로드를 추가하거나 문자열 벡터를 regex로 변경하기 전에 아무런 문제가 없습니다.

나는이 문제가 나와 관련이 있다고 가정하고 boost :: assign 함수를 호출하고, 필자는 그럴 필요가 없다는 것을 알고 있지만 실제로는 '한 줄'함수 호출이 필요하다. ... C++을 처음 접했을 때 어떤 조언도 환영합니다.

감사

+2

개인적인 팁 : 구문 과부하를 피한다면 당신의 삶은 더 행복해 질 것입니다. –

+0

조언을 주셔서 감사합니다, 나는 당신이 옳을 수도 있다고 생각합니다! –

답변

2

문제는이 경우에 부스트 문서, But what if we need to initialize a container? This is where list_of() comes into play. With list_of() we can create anonymous lists that automatically converts to any container:

에서 볼 수 있듯이 당신이 어떤 용기로 변환 할 수 없도록하려는 것입니다, 당신은 특별히 벡터이야합니다. 대신이 변환 가능 유형을 가지고 있기 때문에 bool 또는 vector로 변환해야 할지를 결정할 수 없으므로 호출이 모호합니다.

정말로 작성한 오버로드 세트를 계속하려면 (플래그를 사용하여 한 걸음 뒤로 물러서서 접근 방식을 다시 생각하십시오.) 벡터 목록을 특별히 벡터에 할당해야합니다.

push_at_command(
    "AT?S", 
    boost::assign::list_of("L11"), 
    std::vector<std::string>(boost::assign::list_of("L21")("L22")), 
    0); 
+0

그러나 bool을 사용하는 함수 만 유지하면 오류가 발생합니다 :'std :: _ Deque_iterator 유형의 유효하지 않은 캐스트가 'bool' . 이것은 bool로 변환 될 수 없음을 나타냅니다. – yosim

+0

조언을 주셔서 감사합니다. 이제 이러한 오버로드를 사용하지 않도록 프로그램을 재구성하고 다시 디자인했습니다. –

2

오류 메시지가 문제가 무엇인지를 알려줍니다 : list_of)는 벡터로 변환 연산자를 제공하는 여기에 가정 해요. 곤경에 점점 호출이 세 번째입니다 :

push_at_command(
    "AT?S", 
    boost::assign::list_of("L11"), 
    boost::assign::list_of("L21")("L22"), 
    0); 

과 문제는 모두push_at_command의 세 번째와 네 번째 버전을 일치시킬 수 있다는 것입니다. 세 번째 인수의 유형이 다릅니다. 하나는 vector이고 다른 하나는 bool입니다.

따라서 boost::assign::list_of("L21")("L22)vector으로 변환 될 수 있으며 bool으로 변환 될 수 있으며 규칙은 다른 하나보다 이러한 변환 중 하나를 선호하지 않습니다.이와 같은 경우, 컴파일러의 도움을 받아 static_cast을 원하는 유형으로 사용해야합니다. 또는 이러한 기능의 조직을 다시 생각해보고, 인수를 재정렬하여 모호하지 않게하십시오. (예를 들어, std::string에는 (int, char)을 사용하는 생성자가 있고 char에 대한 생성자가 없기 때문에 모호한 결과를 초래하므로 너무 많은 오버로드가 발생하는 어색한 인터페이스입니다.

+0

Mark B.에 대한 제 질문을 참조하십시오. 귀하의 답변에도 해당됩니다. – yosim