gpt4 book ai didi

C++ : cout with a terenary if-statement

转载 作者:可可西里 更新时间:2023-11-01 16:24:17 25 4
gpt4 key购买 nike

我得到这个错误:“错误:没有上下文类型信息的重载函数”。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com