现在我正在学习模板和向量。我做了一个简单的函数来打印一个向量,该向量包含从.back()
元素到.front()
元素的任何数据类型。
template <typename Type>
void printVectorReverse(const vector<Type>& stuff)
{
for (auto it = stuff.crbegin(); it != crend(); ++it) {
cout << *it << endl;
}
}
我正在编译程序,但出现错误:
$ g++ -std=c++11 template_functions.cpp
template_functions.cpp: In function ‘void printVectorReverse(const std::vector<Type>&)’:
template_functions.cpp:66:49: error: there are no arguments to ‘crend’ that depend on a template parameter, so a declaration of ‘crend’ must be available [-fpermissive]
for (auto it = stuff.crbegin(); it != crend(); ++it) {
^
template_functions.cpp:66:49: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
我在这里没有看到语法错误。函数上方有一个模板类型名声明。 const
通过引用传递了向量以避免复制它,因此函数不会无意间更改向量。我有一个指向.back()
元素的常量反向迭代器。然后,我取消对迭代器的引用,并对其进行递增,直到它到达向量的反向端并下降。我使用auto
是因为向量可以具有任何数据类型。
我该如何读取此错误?这是什么意思?请不要太苛刻,因为这对我来说是一个相对较新的话题。我真的很想学习模板和序列容器。
答案 0 :(得分:4)
读取错误的方式如下:
错误:没有“借贷”的参数依赖于模板参数,所以是 [function] < / em> 'credit'声明必须可用 [-fpermissive]
这意味着编译器不知道crend()
是什么。它怀疑它是一个函数,但是找不到它的声明。
您打错了字;您需要拥有stuff.crend()
:
for (auto it = stuff.crbegin(); it != stuff.crend(); ++it)