нужна помощь с этой ошибкой компиляции для ошибки функции getline: нет соответствующей функции для вызова getline (std :: istream &, char &) '| - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть файл исходного кода с функцией getline, и я получаю сообщение об ошибке при компиляции (код и ошибка приведены ниже).Моя проблема в том, что я скопировал и вставил всю функцию из уже скомпилированной и работающей программы (в том числе и ниже).У меня также есть функция getline в 2 других файлах исходного кода в программе, которые прекрасно компилируются.Я довольно новичок в программировании и только начал программировать на С ++ (намного лучше в Java), поэтому постараюсь сделать ответы простыми.Я просмотрел некоторые из уже опубликованных вопросов и ответов здесь (и в Google), но все ответы, которые я нашел, говорят, что параметры для функции не верны.Но я знаю, что они верны здесь, потому что это работает в другой программе просто отлично.Также, как вы можете видеть в рабочем файле, единственный #included - это iostream, и он работает, то есть с компилятором g ++ в Code :: Blocks.Я также включил все необходимые переменные / константы.

Вот код функции и файла, из которого я получаю сообщение об ошибке.Части, на которые я ссылаюсь, помечены 3 * (извините, что я мог сделать).Ошибка перепечатывается также в нижней части поста.

#include <iostream>
#include <istream>
#include "candidates.h"

using namespace std;

int nCandidatesInPrimary;

int delegatesForThisState;

const int maxCandidates = 10;

int delegatesWon[maxCandidates];

int totalVotes;

int totalDelegates = 0;

int votesForCandidate[maxCandidates];

string candidate[maxCandidates];

int nCandidates;

string candidateNames;

void readCandidates ()
{
  cin >> nCandidates;
  string line;
  getline (cin, line);

  for (int i = 0; i < nCandidates; ++i)
    {
      ***getline (cin, candidateNames[i]);***
      delegatesWon[i] = 0;
    }
}

int findCandidate (std::string name)
{
  int result = nCandidates;
  for (int i = 0; i < nCandidates && result == nCandidates; ++i)
    if (candidateNames[i] == name)
      result = i;
  return result;
}

void printCandidateReport (int candidateNum)
{
  int requiredToWin = (2 * totalDelegates + 2) / 3; // Note: the +2 rounds up
  if (delegatesWon[candidateNum] >= requiredToWin)
    cout << "* ";
  else
    cout << "  ";
  cout << delegatesWon[candidateNum] << " " << candidateNames[candidateNum] << endl;
}

void assignDelegatesToCandidates ()
{
  int remainingDelegates = delegatesForThisState;
  for (int i = 0; i < nCandidatesInPrimary; ++i)
    {
      int candidateNum = findCandidate(candidate[i]);
      int nDel = (delegatesForThisState * votesForCandidate[i] + (totalVotes-1)) / totalVotes;
      if (nDel > remainingDelegates)
    nDel = remainingDelegates;
      delegatesWon[candidateNum] += nDel;
      remainingDelegates -= nDel;
    }
}

- это код из уже работающей программы.

#include <iostream>

using namespace std;

// Max # of candidates permitted by this program
const int maxCandidates = 10;

// Names of the candidates participating in this state's primary
string candidate[maxCandidates];

// Names of all candidates participating in the national election
std::string candidateNames[maxCandidates];

// How many delegates are assigned to the state being processed
int delegatesForThisState;

// How many delgates have been won by each candidate
int delegatesWon[maxCandidates];

// How many candidates in the national election?
int nCandidates;

// How many candidates in the primary for the state being processed
int nCandidatesInPrimary;

// How many states participate in the election
int nStates;

// How many delegates in the election (over all states)
int totalDelegates = 0;

// How many votes were cast in the primary for this state
int totalVotes;

// How many votes wone by each candiate in this state's primary
int votesForCandidate[maxCandidates];


int findCandidate (std::string name);

/**
 * For the most recently read primary, determine how many delegates have
 * been won by each candidate.
 */
void assignDelegatesToCandidates ()
{
  int remainingDelegates = delegatesForThisState;
  for (int i = 0; i < nCandidatesInPrimary; ++i)
    {
      int candidateNum = findCandidate(candidate[i]);
      int nDel = (delegatesForThisState * votesForCandidate[i] + (totalVotes-1)) / totalVotes;
      if (nDel > remainingDelegates)
    nDel = remainingDelegates;
      delegatesWon[candidateNum] += nDel;
      remainingDelegates -= nDel;
    }
}



/**
 * Find the candidate with the indicated name. Returns the array index
 * for the candidate if found, nCandidates if it cannot be found.
 */
int findCandidate (std::string name)
{
  int result = nCandidates;
  for (int i = 0; i < nCandidates && result == nCandidates; ++i)
    if (candidateNames[i] == name)
      result = i;
  return result;
}


/**
 * Print the report line for the indicated candidate
 */
void printCandidateReport (int candidateNum)
{
  int requiredToWin = (2 * totalDelegates + 2) / 3; // Note: the +2 rounds up
  if (delegatesWon[candidateNum] >= requiredToWin)
    cout << "* ";
  else
    cout << "  ";
  cout << delegatesWon[candidateNum] << " " << candidateNames[candidateNum] << endl;
}


/**
 * read the list of candidate names, initializing their delegate counts to 0.
 */
void readCandidates ()
{
  cin >> nCandidates;
  string line;
  getline (cin, line);

  for (int i = 0; i < nCandidates; ++i)
    {
      ***getline (cin, candidateNames[i]);***//already working
      delegatesWon[i] = 0;
    }
}


/**
 * read the info on one state's primaries
 */
void readState ()
{
  totalVotes = 0;
  cin >> nCandidatesInPrimary >> delegatesForThisState;
  totalDelegates += delegatesForThisState;  // "x += y" is a shorthand for "x = x + y"
  string word, line;
  getline (cin, line);
  for (int i = 0; i < nCandidatesInPrimary; ++i)
    {
      cin >> votesForCandidate[i];
      totalVotes = totalVotes + votesForCandidate[i];

      cin >> word;
      getline (cin, line);
      candidate[i] = word + line;
    }
}



/**
 * Generate the report on the national primary election.
 */
int main(int argc, char** argv)
{
  readCandidates();
  int nStates;
  cin >> nStates;
  for (int i = 0; i < nStates; ++i)
    {
      readState();
      assignDelegatesToCandidates();
    }
  for (int i = 0; i < nCandidates; ++i)
    {
      printCandidateReport(i);
    }
  return 0;
}

ошибка: нет подходящей функции для вызова getline(std :: istream &, char &) '|

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

Похоже, вы намеревались объявить кандидатов-имен как vector<string> candidateNames;

vector<string> candidateNames;

void readCandidates ()
{
  cin >> nCandidates;
  string line;
  getline (cin, line);
  candidateNames.resize(nCandidates);    
  for (int i = 0; i < nCandidates; ++i)
    {
       getline (cin, candidateNames[i]);

    }
}
0 голосов
/ 28 сентября 2011

Извините, возможно, я был несправедлив, когда отвечал на этот вопрос.Я смог найти проблему, это было в моем заголовочном файле, я перепутал переменные там.для Кандидат_Имя [] я забыл [] в конце в заголовочном файле.И поскольку я не включил этот файл в свой пост, вы не могли этого увидеть.Спасибо за помощь, хотя.

0 голосов
/ 27 сентября 2011

Похоже, вы забыли

#include <string>

Вероятно, что другие заголовки извлекли сам класс строки, но не все вспомогательные функции, такие как перегрузки getline, которые принимают std::string.

0 голосов
/ 27 сентября 2011

candidateNames - это отдельная строка, а не набор строк.Как насчет настройки вектора из них?

std::vector<string> candidateNames;

А затем перед вашим циклом for:

candidateNames.resize(nCandidates);

...