我有一个方法可以反转向量的对象。我希望无论数据类型如何都能使用该方法,因此我使用模板。 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;
}
我遇到了这些错误:
&#39; std :: vector&#39;:太多的模板广告
&#39; std :: vector&#39;:没有合适的默认构造函数
&#39; x&#39;:未声明的标识符
&#39; y&#39;:未声明的标识符
我不知道为什么我的x和y没有被声明。它们只是用于操作for循环的整数,与模板T完全无关。
我想也许这与我编写反向方法的方式有关,所以我决定编写一个反向方法来处理一个向量,如果单独进行查看是否有效。 vector test = {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
,看起来这种情况下的常见问题与一个具有默认构造函数的类(通常是隐式)有关。然而,我没有类模板,所以我不认为(再次,可能是错误的。非常新的)我有任何应该被调用的构造函数。
思考?
答案 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;
}
我认为最好将其发布到代码审查网站。