C ++ 17 std :: необязательная ошибка: ожидаемое первичное выражение перед ‘auto’

Я экспериментировал с функцией C ++ 17 std::optional

Необязательный тип возврата std::optional<std::pair<int, int>>, Я звоню
sum_pair функция в print_answer функция и хотел дополнительный принт.

В print_answer Функция Я хотел проверить, содержит ли требуемая пара что-то, чтобы показать.
как в примере, приведенном в: Факультативно-возвращаемые фабричные функции могут использоваться как условия while и if

Ниже приведен код: вот оно с ошибкой

#include <iostream>
#include <vector>
#include <unordered_map>
#include <optional>

typedef std::optional<std::pair<int, int>> returnType;

// following algorithum works fine: just to show,
// how I have used the std::optional
returnType sum_pair(const std::vector<int>& vec, const int sum)
{
std::unordered_map<int, int> compIndexMap;

int index = 0;
for(const int& ele: vec)
{
if(auto check = compIndexMap.find(sum - ele); check != compIndexMap.cend())
return returnType{std::make_pair(check->second, index)};

compIndexMap.emplace(sum - ele, index);
++index;
}
return std::nullopt;
}

// problem is here:
void print_answer(const std::vector<int>& vec, const int sum)
{
// if I uncomment the if-else, everything works
/*if*/(auto Pair = sum_pair(vec, sum) )?
std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl: //;
//else
std::cout << "Nothing found!\n";
}
int main()
{
std::vector<int> vec0{ 1,3,2,8 };
const int sum = 8;
print_answer(vec0, sum);
return 0;
}

Когда я использую if-else заявление в следующем формате

(condion) ? print something: print something else;

Я получаю следующие две ошибки. (используется GCC 7.1)

||=== Build: Debug in MyTestProgram (compiler: GNU GCC Compiler) ===|
|25|error: expected primary-expression before 'auto'|
|25|error: expected ')' before 'auto'|

Может кто-нибудь объяснить, почему мне нужно использовать if-else, но не с «оператор?» ?

0

Решение

if(auto Pair = sum_pair(vec, sum) )
std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl;
else
std::cout << "Nothing found!\n";

это действительно C ++. Вам разрешается поместить декларацию в начальном состоянии if пункт.

(auto Pair = sum_pair(vec, sum) )?
std::cout << "Resulting indexes are: " << Pair->first << " " << Pair->second << std::endl
:
std::cout << "Nothing found!\n";

это не действительно C ++. Объявления не являются выражениями. Есть места, где выражения разрешены, а объявления — нет. Левая сторона ?, троичный оператор, является одним из них.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]