当我使用三元运算符在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 :(得分: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)。
中的第5.16节