三元运算符上的函数指针定义

时间:2016-09-21 08:50:50

标签: c++ pointers

当我使用三元运算符在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;
}

2 个答案:

答案 0 :(得分:1)

string.h中定义的strstr的重载是:

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

<cstring>中有两个strstr s:

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

无论哪种方式,这与您的其他功能都不匹配。前者有错误的返回类型,后者有两个重载,你在不允许的情况下使用它。

最简单的方法就是修复&#34;哪个strstr你想要一个lambda并使用它:

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 ;

答案 1 :(得分:0)

strstr函数有多个版本。所以编译器不知道应该使用哪一个,所以你必须告诉编译器你想要哪一个:

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)

还有Working draft, Standard for Programming Language C++

中的第5.16节