2013-02-09 2 views
3

Помощь Я не понимаю, почему я не могу запустить этот фрагмент кода, который предназначен для домашнего задания, и xCode, похоже, не согласен со мной, когда говорит, что я не определил функцию. см ниже в основной погрешности«Нет подходящей функции для вызова« Шаблоны C++

template <class Comparable> 
Comparable maxSubsequenceSum1(const vector<Comparable> & a, int & seqStart, int & seqEnd){ 
     int n = a.size(); 
     Comparable maxSum = 0; 

     for(int i = 0; i < n; i++) 
      for(int j = i; j < n; j++) 
      { 
       Comparable thisSum = 0; 
       for(int k = i; k <= j; k++) 
        thisSum += a[ k ]; 

       if(thisSum > maxSum) 
       { 
        maxSum = thisSum; 
        seqStart = i; 
        seqEnd = j; 
       } 
      } 

     return maxSum; 

} 



int main(){ 


     vector<int> vectorofints; 
     vectorofints.resize(128); 
     for (int i=0; i<vectorofints.size(); i++){ 
      vectorofints[i] = (rand() % 2001) - 1000; 
     } 
     maxSubsequenceSum1(vectorofints, 0, 127) //**---->the error i get in xcode is "No matching function for call to maxSubsequenceSum1" 

     return 0; 
} 
+0

вам не хватает закрывающую скобку после «междунара & seqEnd». Это опечатка или это ошибка в коде? – 2013-02-09 23:30:10

+0

Да, это опечатка, позвольте мне исправить это. –

+0

Я разместил решение для вас. Посмотрите, исправляет ли это это. – 2013-02-09 23:36:35

ответ

2

Изменение подписи от

Comparable maxSubsequenceSum1(const vector<Comparable> & a, 
           int & seqStart, int & seqEnd) 

в

Comparable maxSubsequenceSum1(const vector<Comparable> & a, 
           int seqStart, int seqEnd) 

Та же проблема происходит, если вы могли бы сделать int & i = 0;. Вы не можете инициализировать неконстантную ссылку из rvalue. 0 и 127 - это временные объекты, которые заканчиваются в конце выражения, временные лица не могут связываться с неконстантными ссылками.

+0

Ничего себе, мой профессор на самом деле написал эту часть, поэтому я подумал, что у меня нет причин подвергать сомнению ее, и это было то, что я делал –

+0

Другим обходным путем, чтобы передать значение lvalue, то есть 'int x = 0;', а затем передать 'x' вместо. Однако наличие ссылок на встроенные типы совершенно бессмысленно, вы должны сказать своему профессору, что подпись должна быть изменена. –

+0

@JonathanBuzaglo, вы удивитесь, сколько плохих вещей пытаются преподавать в отношении C++ :( –

0

Компилятор верен. Вы звоните maxSubsequenceSum1(std::vector<int>&, int, int), вы определили maxSubsequenceSum1(std::vector<int>&, int &, int &)

Есть 2 быстрых решений:

1) переопределять функцию, чтобы не принимать ссылки.
2) Переместите ваши константы в переменные и передайте их таким образом.

Примечание: есть еще одна проблема с вашим кодом. Вы вызываете функцию maxSubsequenceSum1, но вы не говорите ей, какой параметр шаблона использовать.

Я был исправлен, и исправление верное. Примечание недействительно.

+2

', но вы не говорите, какой шаблон шаблона использовать.' Это не проблема, это выводимо. –

+0

@JesseGood You –

+0

Спасибо, что исправили его –

0

Вы объявили функцию, которая ожидает две целые ссылки, но тот, который вы вызываете, принимает два целых числа по значению. Это должно быть, как это

vector<int> vectorofints; 
     vectorofints.resize(128); 
     for (int i=0; i<vectorofints.size(); i++){ 
      vectorofints[i] = (rand() % 2001) - 1000; 
     } 
     int k = 0; 
     int j = 127; 
     maxSubsequenceSum1(vectorofints, k, j) 

     return 0; 
+1

Спасибо, что исправили его –

+0

@ M.Alem Вы не объяснили * почему * он должен изменить код. Кроме того, это довольно плохое решение –

Смежные вопросы