Это не сработает (даже если вы исправите ошибку приоритета). У вас здесь две проблемы, вторая более серьезная, чем первая.
Первая проблема заключается в том, что 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
. Исходное сообщение об ошибке, которое вы получили, исчезнет.
Однако это сразу же выявит вторую, более серьезную проблему с этим выражением: специализированная endl
- это функция (которая в этом контексте распадается на указатель функции), а ""
- строковый литерал. Вы не можете смешивать указатель функции и строковый литерал в таком операторе ?:
. Эти типы несовместимы. Они не могут использоваться вместе как 2-й и 3-й операнд троичного ?:
. Об этой второй проблеме компилятор выдаст другое сообщение об ошибке.
Итак, в общем, последняя проблема, с которой вы столкнулись, выглядит так, как будто вы пытались сделать что-то вроде
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