在此C ++程序中,函数print_nums
不接受
在vector<double>
中调用switch_function
数字作为实际参数时,我希望add_num
函数接受vector作为参数,但我认为这会导致相同的错误!
请注意,提到的错误未出现在此代码中,但是当我编译此代码以及将double min
更改为double minn
或将double max
更改为{{时,会出现许多错误和警告。 1}}对于上面提到的错误,我还是很感兴趣,因为我还是C ++的初学者,所以请解释一下为什么我不能使用单词min和max,也不能使用函数double maxx
的主要错误以及其他任何错误或警告。
print_nums
答案 0 :(得分:4)
您使用using namespace std;
(摆脱这种习惯),这意味着将std::min
和std::max
从std
名称空间引入全局名称空间。这就是为什么您不能在自己的代码中使用这些名称的原因,因为它们已经定义。
答案 1 :(得分:0)
我仍然是C ++的初学者,因此请解释为什么我不能使用单词min和max ...
可以!
第一节(下面)演示了(以最少的代码)正在发生的事情。
第二部分显示了一个“解决方案”(如下)。
奖金-第三部分使用C ++类解决。
1)两种编码选择中的第一种是[MCVE](您应该识别出它的起源),它会重现此选择引起的歧义性(并因此产生错误)。
// this first section matches your code,
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
// this 'using' pulls a 'min' and 'max' (probably functions)
// from some std:: declaration
double min = FLT_MAX;
double max = FLT_MIN;
// ----^^^---- and now these 2 items create two ambiguity's because
// at this point, the compiler can no longer distinguish
// between the two min's (or max's).
void program_func(int argc, char* argv[]) {
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n " << min // error: reference to ‘min’ is ambiguous
<< " " << max // error: reference to ‘max’ is ambiguous
<< std::endl;
}
int main(int argc, char* argv[]) {
program_func();
return 0;
}
2)供您考虑,解决难题的另一个(尚未提及的)“解决方案”(以MCVE形式)是将您的代码尽可能简单地移至“可区别的”命名空间 。可以很容易地完成此操作:
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
// this 'using' pulls a 'min' and 'max' (probably functions)
// from some std:: declaration (as previous)
// now place all of **your** code (except main()) into a distinguishing namespace.
namespace AZ // (your initials, if you are not already using them ;)
{
double min = FLT_MAX; // these are now AZ::min
double max = FLT_MIN; // and AZ::max - unambiguous!
void program_func(int argc, char* argv[])
{
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n\n " << min // reference to AV::min
<< " " << max // and AV::max
<< std::endl;
}
} // namespace AZ end
int main(int argc, char* argv[])
{
AZ::program_func(argc, argv); // NOTE AZ:: namespace qualifier!
return 0;
}
本节编译并正确运行。
符号不再“冲突”,相对于std :: min和std :: max,AZ :: min和AZ :: max是唯一且可区分的。
注意1:这应该足以激励他们选择不使用“ using namespace std;”这一行。
注2:如果保留“ using namespace std;”行,请不将其放置在您独特的命名空间包装器(AV)中。
是的-在您独特的命名空间中仍然可以访问std ::,它们分别称为std :: min和std :: max。
函数print_nums的主要错误
也许有第二个值得提出的问题。在您的MCVE上工作,并使用SO工具进行练习。您可以通过提问获得积分(向下投票是要求您进行更多练习的贡献者!)。
我想向您强调mcve的“ M”。 'print_nums'错误甚至与第一个问题有关吗?
以及其他任何错误或警告。
通常,“帮助调试我的代码”不适用于此站点。
3)解决困境的另一个(尚未提及)的“解决方案”是将您的代码尽可能简单地移入“区分”类。
您已将此代码标记为C ++。恕我直言,C ++的主要功能是类。因此,我建议初学者将精力集中在创建和使用类上,并学习提供的库(
使用区分类:
#include <iostream>
#include <vector>
#include <climits>
#include <cfloat>
using namespace std;
class AZ_t // suffix '_t' because a class defines a type
{
double min = FLT_MAX; // these are now AZ_t::min
double max = FLT_MIN; // and AZ_t::max - unambiguous!
int program_func(int argc, char* argv[])
{
std::cout << "\n " << argc
<< " " << argv[0]
<< "\n\n " << min // reference to AZ_t::min
<< " " << max // and AZ_t::max
<< std::endl;
}
// NOTE3 - see below
public: // above this statement is private
// a functor is easy to use, but it needs one more function:
int operator()(int argc, char* argv[]) {
return program_func(argc, argv);
}
}; // class AZ end
int main(int argc, char* argv[]) // main is now 1/2 the size
{
return AZ_t()(argc, argv); // because this functor is a 1 liner!
// ^^^^^^^^^^^^ -- parameter to operator()
// ^^^^^^ -- instance ctor (constructor)
// ^^^ -- operator() returns int
// instance dtor (destructor) runs when 1 liner is complete
}
本节编译并正确运行。
注3:此时,类AZ_t中是其余代码的位置。关于“在类中”编码的一件好事是,您不需要功能转发。 (您的帖子大约有6条转发-C风格代码的证据)只需按任意顺序展示该功能(编译器即可弄清楚),但我建议您尝试使用最可读的顺序。
答案 2 :(得分:0)
第using namespace std
行表示您包括std名称空间。通过包含此内容,您将在此命名空间中包含许多函数和变量。
使用任何变量时,如果namespace std
中存在具有相同名称的变量,则它将与其绑定在一起。现在,通过在代码中声明另一个变量,使编译器感到困惑,编码人员正在引用哪个变量。
尝试为变量max_num
和min_num
使用更有意义的名称。
如果仍要使用max
和min
,请在用户定义的命名空间中声明它们,并在代码中引用它们。