- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我得到这个错误:“错误:没有上下文类型信息的重载函数”。
cout << (i % 5 == 0) ? endl : "";
我正在做的事情可行吗?我只是做错了,还是我必须重载 << 运算符?
最佳答案
它不会那样工作(即使你修复了优先级错误)。这里有两个问题,第二个比第一个更严重。
第一个问题是std::endl
是一个模板。它是一个函数模板。模板必须是专门的。为了专门化该模板,编译器必须知道(推断)模板参数。当你做的时候
std::cout << std::endl;
operator <<
期望的特定函数指针类型是编译器用来弄清楚如何专门化 std::endl
的东西模板。
但是在您的示例中,您基本上“分离”了 std::endl
来自 operator <<
通过移动 std::endl
进入 ?:
子表达式。现在编译器必须先编译这个表达式
(i % 5 == 0) ? endl : ""
此表达式无法编译,因为编译器不知道如何专门化 std::endl
模板。没有任何上下文就无法推断模板参数。
例如,这个简单的C++程序
#include <iostream>
int main() {
std::endl;
}
也将因为同样的原因而无法编译:没有上下文,编译器不知道如何实例化 std::endl
。 .
您可以通过显式指定模板参数来“帮助”编译器解决问题
(i % 5 == 0) ? endl<char, char_traits<char> > : "";
这将明确告诉编译器如何实例化 endl
.您收到的原始错误消息将会消失。
但是,这将立即揭示该表达式的第二个更严重的问题:specialized endl
是一个函数(在此上下文中衰减为函数指针),而 ""
是一个字符串文字。您不能在 ?:
中混合使用函数指针和字符串文字运营商那样。这些类型是不兼容的。它们不能一起用作三元的第二个和第三个操作数 ?:
.编译器将针对第二个问题发出不同的错误消息。
所以,基本上,你在这里遇到的最新问题就好像你试图做类似的事情
cout << (i % 5 == 0 ? 10 : "Hi!");
这不会编译,原因与您的表达式无法编译的原因相同。
所以,你试图写的表达式不能那样写。在不尝试使用 ?:
的情况下重写它运营商。
作为支持,请参阅以下文字记录:
$ cat qq.cpp
#include <iostream>
using namespace std;
int main (void) {
int i = 5;
cout << ((i % 5 == 0) ? endl : "");
return 0;
}
$ g++ -o qq qq.cpp
qq.cpp: In function 'int main()':
qq.cpp:5: error: overloaded function with no contextual type information
关于C++ : cout with a terenary if-statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726427/
我是一名优秀的程序员,十分优秀!