2016-09-21 2 views
0

삼항 연산자를 사용하여 C++에서 함수 포인터를 정의하면 컴파일러 오류 overloaded function with no contextual type information이 발생합니다. 혼란 스럽습니다. 누군가가 나에게이 행동의 이유를 설명 할 수 있을까요?삼항 연산자에서 함수 포인터 정의

#include <string> 
#include <string.h> 
#include <iostream> 

const char *my_strstr1 (const char *__haystack, const char *__needle) { 
    std::cout << "my_strstr" << std::endl; 
    return strstr(__haystack, __needle); 
} 

const char *my_strstr2 (const char *__haystack, const char *__needle) { 
    std::cout << "my_strstr2" << std::endl; 
    return strstr(__haystack, __needle); 
} 

int main(int argc, char** argv) { 
    std::cout << "argc:" << argc << std::endl; 

    //ok 
    // const char* (*StrStr)(const char*, const char*) = strstr; 
    // const char* (*StrStr)(const char*, const char*) = (argc > 1) ? my_strstr2 : my_strstr1; 

    // error: overloaded function with no contextual type information 
    const char* (*StrStr)(const char*, const char*) = (argc > 1) ? my_strstr1 : strstr; 

    StrStr("helloworld", "h"); 

    return 0; 
} 
+0

작성 하시겠습니까? (argc> 1)? my_strstr1 : my_strstr2; – user3286661

+0

@ user3286661 아니요, OP는 표준 라이브러리'strstr'을 사용하려고합니다. –

+0

그런 다음 std :: – user3286661

답변

0

.

const char* (*StrStr)(const char*, const char*) = (argc > 1) ? my_strstr1 : (const char* (*)(const char*, const char*))strstr; 

당신은 유사한 SO 질문에 좀 걸릴 수 있습니다 : Return type of '?:' (ternary conditional operator) 당신이 원하는 하나의 컴파일러에게 그래서 그래서 컴파일러가 사용되어야하는 하나 모르겠어요.

또한 섹션 5.16을 Working draft, Standard for Programming Language C++

+0

그러면이 코드가 올바른 버전을 선택하는 방법을 알고있는 이유는 무엇입니까? // ok // const char * (* StrStr) (const char *, const char *) = strstr; – izual

+0

자질 연산자가 알고 있습니다. 삼항 연산자는 아닙니다. – KIIV

+0

u에 대해 더 자세히 설명하거나 링크를 공유 할 수 있습니까? C++을 사용한 이후로 처음 들어 봤습니다. 3q. – izual

1

string.h에 정의 strstr의 과부하는 다음과 같습니다

char *strstr(const char* str, const char* substr); 

그리고 <cstring>strstr의가있다 :

const char* strstr(const char* str, const char* target); 
     char* strstr(  char* str, const char* target); 

다른 기능과 일치하지 않는 어느 방법, . 전자는 잘못된 반환 유형을 가지고 있으며 후자는 두 가지 과부하가 있으며이를 허용하지 않는 컨텍스트에서 사용하고 있습니다.

가장 간단한 방법은 당신이 람다와 함께 할 strstr "수정"하고 단지를 사용할 수 있습니다 :

strstr 기능의 여러 버전이 있습니다
using F = const char*(*)(const char*, const char*); 
F std_version = [](const char* s, const char* t) -> const char* { 
    return strstr(s, t); 
}; 

F StrStr = (argc > 1) ? my_strstr1 : std_version ; 
+0

'std'가 네임 스페이스이기 때문에 충돌하지 않을까요? –

+0

나는 그 코드가 올바르게 컴파일 될 수 있다고 생각한다. // ok // const char * (* StrStr) (const char *, const char *) = strstr; – izual

+1

@GillBates 아니요. 하지만 어쨌든 그것을 바 꾸었습니다. – Barry