gpt4 book ai didi

c++ - 模板声明不能出现在 block 范围内

转载 作者:行者123 更新时间:2023-11-27 23:56:47 28 4
gpt4 key购买 nike

我正在学习李普曼,而且我只是在学习。我在这里尝试编写一个代码,该代码将返回 vector 中的最小元素。当我在 Codeblocks 中编译我的代码时,它说:“模板声明不能出现在 block 范围内”。这是代码:

#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;
}

最佳答案

您不能在函数内部定义模板,main 是一个函数。您需要在 main 之前定义您的 min 函数模板。

您的代码中还有其他几个问题。

template <class elemType>

必须紧接在函数定义之前。放

elemType save;

它们之间的语法不正确。

另一个问题是您在 vector 中选择最小值的算法。你为什么会有这个

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;
}

如果你需要处理空 vector ,你可以添加

if (!vec.size()) throw std::length_error("empty vector passed to min");

在函数的开头,或者返回一个迭代器而不是元素引用,因为即使对于空 vector ,end() 的定义也很明确。

关于c++ - 模板声明不能出现在 block 范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42120431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com