C ++:具有三级if语句的cout

|| 我收到此错误:\“错误:没有上下文类型信息的重载函数\”。
cout << (i % 5 == 0) ? endl : \"\";
我正在做什么?我只是做错了,还是必须重载<<操作符?
已邀请:
它不会那样工作(即使您修复了优先级错误)。您这里有两个问题,第二个问题比第一个严重。 第一个问题是ѭ1是模板。它是一个功能模板。模板必须是专门的。为了专门化该模板,编译器必须知道(推断)模板参数。当你做
std::cout << std::endl;
operator <<
期望的特定函数指针类型是编译器用来弄清楚如何专门化
std::endl
模板的类型。 但是,在您的示例中,您实际上是通过将ѭ1移到
?:
子表达式中来“分离”“ 1和ѭ3。现在,编译器必须先编译此表达式
(i % 5 == 0) ? endl : \"\"
由于编译器不知道如何专门化ѭ1ize模板,因此无法编译该表达式。没有上下文就无法推断出模板参数。 例如,这个简单的C ++程序
#include <iostream>
int main() {
   std::endl;
}
也会由于相同的原因而无法编译:没有上下文,编译器将不知道如何实例化
std::endl
。 您可以“帮助”编译器通过显式指定模板参数来解决问题。
(i % 5 == 0) ? endl<char, char_traits<char> > : \"\";
这将明确告诉编译器如何实例化
endl
。您收到的原始错误消息将消失。 但是,这将立即揭示该表达式的第二个更严重的问题:专门的
endl
是一个函数(在这种情况下会衰减为函数指针),而
\"\"
是一个字符串文字。不能像这样在
?:
运算符中混合使用函数指针和字符串文字。这些类型不兼容。它们不能同时用作三元
?:
的第二和第三操作数。编译器将针对此第二个问题发出不同的错误消息。 因此,基本上,您遇到的最新问题就好像您尝试执行类似
cout << (i % 5 == 0 ? 10 : \"Hi!\");
出于与您的表达式无法编译相同的原因,这将无法编译。 因此,您尝试编写的表达式不能以这种方式编写。无需尝试使用trying8ѭ运算符即可对其进行重写。 作为支持,请参阅以下记录:
$ 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
?
运算符的两个参数必须具有相同的类型(至少在潜在的提升,隐式构造函数,强制转换运算符等插入之后)。 “ 1”实际上是一个函数模板(详细信息如下),流随后调用该函数模板以影响其状态:它不是类似于“ 16”的字符串文字。 因此,您无法完全做到这一点,但是您可能可以得到您真正想要的行为-考虑是否...
expr ? \"\\n\" : \"\"
...满足您的需求-相似,但不刷新流(恕我直言,
std::cout
通常应尽可能少地刷新-尤其是通过低级库代码-因为这样可以提供更好的性能)。 (它也更灵活,例如
expr ? \"whatever\\n\" : \"\"
/不能在字符串文字后附加
endl
。) 例如。对于GCC 4.5.2,
endl
为:
template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>& 
    endl(basic_ostream<_CharT, _Traits>& __os)
    { return flush(__os.put(__os.widen(\'\\n\'))); }
?:
的两个选择必须具有相同的类型,或者一个可以转换为另一个。
endl
是模板,上下文未提供足够的信息可供选择。所以它甚至都没有类型。 (那是您的错误信息)。 正如其他人已经说过的那样,绑定不是您所期望的。
这很有可能(我自己对此表示怀疑)。但是,它也很愚蠢,实际上也很愚蠢:
cout << \"\";
在这种情况下,您应该做的很简单:
if (i % 5 == 0) cout << endl;
您不应该仅仅为了使用它而使用三元。实际上,您不应该仅仅为了使用它而使用任何语言功能。我不写像这样的代码:
if (1) { doSomething(); }
只是因为我可以。一个简单的36英镑要好得多。
试试这个,它的工作原理:
cout << ((i % 5 == 0) ? \"\\n\" : \"\");
这是使其正常工作的样子:
cout << ((i % 5 == 0) ? \'\\n\' : \" \");
运算符
<<
的优先级高于
?:
。尝试这个:
cout << ((i % 5 == 0) ? endl : \"\");

要回复问题请先登录注册