我学习Lipmann而我只是在学习。我在这里尝试编写一个代码,它将在向量中返回一个最小元素。当我在Codeblocks中编译我的代码时,它说:"模板声明不能出现在块范围"。这是代码:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
template <class elemType>
elemType save;
elemType min (const std::vector<elemType> &vec) {
std::vector<elemType>::iterator it = vec.begin(), end_it = vec.end();
std::vector<elemType>::iterator iter = std::next(it, 1);
for ( ; it != end_it; it++ ) {
if ( *it < *(it + 1) ) {
save = *it;
}
if (save < *it) {
save = *it;
}
}
};
int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100};
std::vector<int> vec_train(massiv,massiv+10);
min(vec_train);
return 0;
}
答案 0 :(得分:2)
您无法在函数内定义模板,main
是一个函数。您需要在main之外定义min
函数模板。
您的代码中还有其他几个问题。在
template <class elemType>
必须出现在函数定义之前。把
elemType save;
它们之间的语法不正确。
另一个问题是您在矢量中选择最小值的算法。为什么你有这个
if (*save < *(it + 1) ) { save = *it; }
和这个
if (*save < *it ) { save = *it; }
同时?
这是你可能想要的:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
template <class elemType>
const elemType& min(const std::vector<elemType>& vec) {
typename std::vector<elemType>::const_iterator
select = vec.begin(),
it = std::next(select),
end = vec.end();
for ( ; it != end; ++it ) {
if ( *it < *select ) select = it;
}
return *select;
};
int main() {
int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100};
std::vector<int> vec_train(massiv,massiv+10);
std::cout << min(vec_train) << std::endl;
return 0;
}
如果您需要处理空矢量,可以添加
if (!vec.size()) throw std::length_error("empty vector passed to min");
在函数的开头,或返回迭代器而不是元素引用,因为即使对于空向量,end()
也很明确。