У меня есть метод, который меняет объекты вектора. Я хочу иметь возможность использовать метод независимо от типа данных, поэтому я использую шаблон. 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
Проголосовало за то, чтобы закрыть как отсутствующий пример, который воспроизводит проблему. На всякий случай, если вы не знаете, существует функция ['std :: reverse'] (http://en.cppreference.com/w/cpp/algorithm/reverse). –
Какой пример вам понравится? Мое решение? Он даже не будет компилироваться ... Как я могу предоставить то, что вы ищете? – Podo
Никто не может догадаться, как выглядит код, вызывающий проблему. Вы должны показать это, если хотите получить ответ.Попробуйте ** уменьшить ** его до минимального примера, но все же завершить, чтобы читатели могли просто скопировать и вставить его, чтобы воспроизвести ошибку. –