2016-06-10 3 views
-1

У меня есть метод, который меняет объекты вектора. Я хочу иметь возможность использовать метод независимо от типа данных, поэтому я использую шаблон. EX:. «1 2 3 4» становится «4 3 2 1» & «как теперь бурая корова» становится «корова коричневый теперь, как»Метод шаблона «Для цикла» для обратного вектора

Это мой текущий метод шаблона (Полный код добавлен для копирования и вставки цели)

#include "stdafx.h" 
#include <iostream> 
using namespace std; 
template <class T> 
void fillVector(vector<T>& vect, const T array[], int size) 
{ 
for (int index = 0; index < size; ++index) 
    vect.push_back(array[index]); 
} 

template<class T> 
void reverse(vector<T>& vect) 
{ 

    if (vect.empty()) 
    { 
     throw EmptyVectorException(); 
    } 

    else 
    { 

     int endVal = vect.size(); 

     for (int x = 0, y = endVal-1; x < (endVal/2); x++, y--) 
     { 
      T temp = vect[x]; 
      vect[x] = vect[y]; 
      vect[y] = temp; 
     } 
    } 

} 


template<class T> 
void output(const vector<T>& vect) 
{ 
    for (int index = 0; index < static_cast<int>(vect.size()); index++) 
    { 
     cout << vect[index] << " "; 
    } 
} 

int main() 
{ 

const string strings[] = { "How ", "Now ", "Brown ", "Cow" }; 
const char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
const int intNmbrs[] = { 1, 3, 5, 7, 9, 11, 13 }; 
const double dblNmbrs[] = { 11.1, 22.2, 33.3, 44.4, 55.5, 66.6 }; 

const int STRINGS_SIZE = sizeof(strings)/sizeof(strings[0]); 
const int CHARS_SIZE = sizeof(chars)/sizeof(chars[0]); 
const int INTS_SIZE = sizeof(intNmbrs)/sizeof(intNmbrs[0]); 
const int DOUBLES_SIZE = sizeof(dblNmbrs)/sizeof(dblNmbrs[0]); 

vector<int> intVector; 
vector<double> doubleVector; 
vector<string> stringVector; 
vector<char> charVector; 

// Fill the "vector" objects 
fillVector(intVector, intNmbrs, INTS_SIZE); 
fillVector(doubleVector, dblNmbrs, DOUBLES_SIZE); 
fillVector(stringVector, strings, STRINGS_SIZE); 
fillVector(charVector, chars, CHARS_SIZE); 

vector<int> emptyVector; 

cout << "\nExample #3: Reverse the sequence of all \"vector\" objects"; 
reverse(intVector); 
reverse(doubleVector); 
reverse(stringVector); 
reverse(charVector); 

cout << "\n \"intVector\": "; 
output(intVector); 
cout << "\n \"doubleVector\": "; 
output(doubleVector); 
cout << "\n \"stringVector\": "; 
output(stringVector); 
cout << "\n \"charVector\": "; 
output(charVector); 
cout << endl; 


return 0; 
} 

Я встречался с этими ошибками:

'станд :: вектор': слишком много шаблонов arugments

'станд :: вектор': нет необходимости конструктора по умолчанию доступен

«х»: необъявленный идентификатор

«у»: необъявленный идентификатор

Я понятия не имею, почему мои х и у не объявлены. Это просто целые числа, используемые для работы цикла for, и вообще не имеют отношения к шаблону T.

Я подумал, что, возможно, это как-то связано с тем, как я написал обратный метод, поэтому я решил написать обратный метод, который имеет дело с вектором, если только ints, если он будет работать. векторный тест = {1,2,3,4,5,6,7,8,9};

int sizeOf = test.size();  

for (int x = 0, y = sizeOf-1; x < (sizeOf/2); x++, y--) 
{ 
    int temp = test[x]; 
    test[x] = test[y]; 
    test[y] = temp; 
} 

Этот код работал нормально. Поэтому я знаю, что это не имеет никакого отношения к тому, как я закодировал свой обратный алгоритм.

Я искал и обнаружил, что ошибка 'std::vector': too many template arugments часто возникает при попытке передать шаблон слишком многим параметрам. Я не верю, что это имеет место в моей ситуации (но я могу быть очень неправ, не так ли?)

Что касается 'std::vector': no appropriate default constructor available, похоже, что обычная проблема в этом случае связана с наличием класса с вызываемым конструктором по умолчанию (обычно неявно). Тем не менее, у меня нет шаблона класса, поэтому я не думаю (опять же, может быть, неправильно. Очень новый), что у меня есть любые конструкторы, которые должны быть вызваны вообще.

Мысли?

Прочитали No appropriate default constructor

Too many template Parameter и

+0

Проголосовало за то, чтобы закрыть как отсутствующий пример, который воспроизводит проблему. На всякий случай, если вы не знаете, существует функция ['std :: reverse'] (http://en.cppreference.com/w/cpp/algorithm/reverse). –

+0

Какой пример вам понравится? Мое решение? Он даже не будет компилироваться ... Как я могу предоставить то, что вы ищете? – Podo

+0

Никто не может догадаться, как выглядит код, вызывающий проблему. Вы должны показать это, если хотите получить ответ.Попробуйте ** уменьшить ** его до минимального примера, но все же завершить, чтобы читатели могли просто скопировать и вставить его, чтобы воспроизвести ошибку. –

ответ

1

Я не получить ваши точные ошибки, но я пометил соответствующие исправления ниже.

Я запустил код через AStyle, чтобы исправить форматирование.

//#include "stdafx.h" 
#include <iostream> 

#include <vector>   //!FIX 
#include <string>   //!FIX 

using namespace std; 
template <class T> 
void fillVector(vector<T>& vect, const T array[], int size) 
{ 
    for (int index = 0; index < size; ++index) 
     vect.push_back(array[index]); 
} 

template<class T> 
void reverse(vector<T>& vect) 
{ 

    if (vect.empty()) 
    { 
     //throw EmptyVectorException; 
     return;  //!FIX 
    } 

    else 
    { 

     int endVal = vect.size(); 

     for (int x = 0, y = endVal-1; x < (endVal/2); x++, y--) 
     { 
      T temp = vect[x]; 
      vect[x] = vect[y]; 
      vect[y] = temp; 
     } 
    } 

} 


template<class T> 
void output(const vector<T>& vect) 
{ 
    for (int index = 0; index < static_cast<int>(vect.size()); index++) 
    { 
     cout << vect[index] << " "; 
    } 
} 

int main() 
{ 

    const string strings[] = { "How ", "Now ", "Brown ", "Cow" }; 
    const char chars[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
    const int intNmbrs[] = { 1, 3, 5, 7, 9, 11, 13 }; 
    const double dblNmbrs[] = { 11.1, 22.2, 33.3, 44.4, 55.5, 66.6 }; 

    const int STRINGS_SIZE = sizeof(strings)/sizeof(strings[0]); 
    const int CHARS_SIZE = sizeof(chars)/sizeof(chars[0]); 
    const int INTS_SIZE = sizeof(intNmbrs)/sizeof(intNmbrs[0]); 
    const int DOUBLES_SIZE = sizeof(dblNmbrs)/sizeof(dblNmbrs[0]); 

    vector<int> intVector; 
    vector<double> doubleVector; 
    vector<string> stringVector; 
    vector<char> charVector; 

// Fill the "vector" objects 
    fillVector(intVector, intNmbrs, INTS_SIZE); 
    fillVector(doubleVector, dblNmbrs, DOUBLES_SIZE); 
    fillVector(stringVector, strings, STRINGS_SIZE); 
    fillVector(charVector, chars, CHARS_SIZE); 

    vector<int> emptyVector; 

    cout << "\nExample #3: Reverse the sequence of all \"vector\" objects"; 
    reverse(intVector); 
    reverse(doubleVector); 
    reverse(stringVector); 
    reverse(charVector); 

    cout << "\n \"intVector\": "; 
    output(intVector); 
    cout << "\n \"doubleVector\": "; 
    output(doubleVector); 
    cout << "\n \"stringVector\": "; 
    output(stringVector); 
    cout << "\n \"charVector\": "; 
    output(charVector); 
    cout << endl; 


    return 0; 
} 

Я думаю, что это, вероятно, лучше было бы отправлено на сайт обзора кода.

+0

Это более подходящее сообщение для обзора кода? Я не член, и я так и не рискнул. Я посмотрю ваш пост и продолжаю взламывать его. Если я не смогу найти что-нибудь, я отправлю его таким образом. Спасибо. – Podo

+0

Это более подходящий ответ для CR, но исходный вопрос не соответствует теме, потому что они спрашивают о нерабочем коде. – Hosch250

+0

@ Hosch250, так как когда нерабочий код действительно отключен от темы для stackoverflow? Почти каждый вопрос здесь касается нерабочего кода. Это глупо сказать. Теперь я понимаю, что CR - лучшее место для этого, но я видел сотни и сотни людей, отправляющих биты кода, которые не работают, ища ответ прямо здесь, на S.O. – Podo

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