为什么即使我没有进行转换,此代码中也有转换?

Why is there a conversion in this code even though I'm not doing one?

本文关键字:转换 代码 为什么      更新时间:2023-10-16

我刚刚在大学完成了一门关于 c++ 的课程,我们得到了最后的作业。(我只是想澄清一下:这绝不是我要求你为我做功课,我只是需要一些代码方面的帮助。

赋值的第一部分是编写一个泛型函数,该函数获取一个函子和 2 个索引:函子是一个条件,索引指向容器中的第一个元素和容器中最后一个元素之后的位置。该函数需要检查容器中有多少对元素满足函子的条件。

这是我的代码:

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
bool test(vector<int> v);
template<typename InputIterator, typename Condition>
int checkCondition(InputIterator first, InputIterator last, Condition condition);
class bigger{
public:
bigger() = default;
~bigger = default();
bigger(const bigger&) = default;
bigger& operator=(const bigger&) = default;
bool operator()(int a, int b) const {
return (a<b);
}
};
template<typename InputIterator, typename Condition>
int checkCondition(InputIterator first, InputIterator last, Condition condition){
int counter = 0;
while (first!=last){
vector<int>::iterator temp = first;
++temp;
if (condition(*first, *temp)){
counter++;
}
++first;
}
return counter;
}
bool test(vector<int> v){
vector<int>::iterator first = v.begin();
vector<int>::iterator last = v.end();
bigger condition();
return checkCondition(first, last, condition);
}

这是我使用 Linux 的终端(ubuntu 因为我使用的是 windows(使用 g++ 进行编译时得到的错误:

part1OfDry.cpp: In instantiation of ‘int checkCondition(InputIterator, InputIterator, Condition) [with InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; Condition = bigger (*)()]’:
part1OfDry.cpp:41:49:   required from here
part1OfDry.cpp:29:22: error: too many arguments to function
if (condition(*first, *temp)){
~~~~~~~~~^~~~~~~~~~~~~~~
part1OfDry.cpp:29:22: error: could not convert ‘condition()’ from ‘bigger’ to ‘bool’

这是我的编译行:g++ -o test1.exe -std=c++11 -Wall -pedantic-errors -Werror -DNDEBUG thing.cpp

如果有人可以解释为什么会发生错误,我将不胜感激。

尝试写作

bigger condition{};

或者,正如0x5453所建议的那样,简单地

bigger condition;

而不是

bigger condition();

问题:从错误消息中可以看出,bigger condition();被解释

Condition = bigger (*)()

作为返回bigger的函数的声明。

搜索"最令人烦恼的解析"以获取澄清。

停止在不需要的地方添加括号。

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
bool test(vector<int> v);
template<typename InputIterator, typename Condition>
int checkCondition(InputIterator first, InputIterator last, Condition condition);
class bigger{
public:
bigger() = default;
~bigger() = default;
bigger(const bigger&) = default;
bigger& operator=(const bigger&) = default;
bool operator()(int a, int b) const {
return (a<b);
}
};
template<typename InputIterator, typename Condition>
int checkCondition(InputIterator first, InputIterator last, Condition condition){
int counter = 0;
while (first!=last){
vector<int>::iterator temp = first;
++temp;
if (condition(*first, *temp)){
counter++;
}
++first;
}
return counter;
}
bool test(vector<int> v){
vector<int>::iterator first = v.begin();
vector<int>::iterator last = v.end();
bigger condition;
return checkCondition(first, last, condition);
}