Как я могу исправить отсутствующие аргументы шаблона до ‘(‘ проблема с токеном здесь?

#c #data-structures #std-pair

Вопрос:

Я получаю проблему в строках 15 и 20, где я пытаюсь вернуть элементы в вектор пары

 #include <iostream>
#include <vector>
#include <utility>

using namespace std;


int main()
{
    int x, y, a, b, c, d, j, m, v;
    vector<pair<int, int> > ladder;
    cin >> x >> y;
    for (int i = 0; i < x; i  ) {
        cin >> a >> b;
        ladder.push_back(pair(a, b));
    }
    vector<pair<int, int> > snake;
    for (int i = 0; i < y; i  ) {
        cin >> c >> d;
        snake.push_back(pair(c, d));
    }
    vector<int> moves;
    cin >> v;
    while (v != 0) {
        moves.push_back(v);
        v = 0;
        cin >> v;
    }
    return 0;
}
 

Мои ошибки:

 prog.cpp: In function ‘int main()’:
prog.cpp:15:30: error: missing template arguments before ‘(’ token
         ladder.push_back(pair(a, b));
                              ^
prog.cpp:20:29: error: missing template arguments before ‘(’ token
         snake.push_back(pair(c, d));
 

У меня есть код для тестирования:
https://ideone.com/ZPKP4s

Комментарии:

1. Строка 15 vector<int> moves; и строка 20 cin >> v; — если я считаю правильно — лучше поместите комментарий за соответствующие строки и, пожалуйста, опубликуйте точное сообщение об ошибке в виде текста.

2. Кроме того, какой компилятор вы используете и какие параметры командной строки вы используете, в частности, какой языковой стандарт (CTAD является новым для C 17).

3. Используйте компилятор C 17.

4. @RaymondChen Я использую c 14, так что, возможно, это может быть проблемой. Но я исправил проблему, используя метод scohoe001s в комментарии. Возможно, более старая версия нуждается в указании, тогда как более новые версии этого не делают

5. C 14 требует, чтобы вы указали тип. C 17 добавляет функцию CTAD, которая позволяет ее опустить. C 14 имеет упрощенный механизм построения пар : ladder.push_back(std::make_pair(a, b)) . Или вы можете использовать ladder.emplace_back(a, b) и разрешить emplace создание пары.

Ответ №1:

Вычет параметров шаблона для std::pair не работает до C 17.

Вам нужно явно указать параметры шаблона, std::pair<int,int>(a, b) , или полностью обойти это и создать pair на месте, используя vector emplace_back функцию-член, которая пересылает заданные аргументы pair<int,int> конструктору в vector «как есть»:

 ladder.emplace_back(a, b);
// ...
snake.emplace_back(c, d);
 

Вот ваш код, использующий emplace_back вместо этого.

Ответ №2:

Ваша проблема в этих двух строках:

 ladder.push_back(pair(a, b));
ladder.push_back(pair(c, d));
 

Вам нужно указать, какие типы пар это:

 ladder.push_back(pair<int, int>(a, b));
ladder.push_back(pair<int, int>(c, d));
 

Комментарии:

1. Поскольку это создает pair<int, int> с a помощью и b , а затем помещает его в вектор, было бы даже лучше просто использовать ladder.emplace_back(a, b) здесь. Смотрите также en.cppreference.com/w/cpp/container/vector/emplace_back

2. это сработало, спасибо!!

Ответ №3:

 ladder.push_back(pair(a, b));
 

Вы должны передать аргумент шаблона класса std::pair

 ladder.push_back(pair<int, int>(a, b));