为什么我不能使用单词min和max作为变量名?

时间:2018-07-03 16:26:51

标签: c++

在此C ++程序中,函数print_nums不接受 在vector<double>中调用switch_function数字作为实际参数时,我希望add_num函数接受vector作为参数,但我认为这会导致相同的错误!

请注意,提到的错误未出现在此代码中,但是当我编译此代码以及将double min更改为double minn或将double max更改为{{时,会出现许多错误和警告。 1}}对于上面提到的错误,我还是很感兴趣,因为我还是C ++的初学者,所以请解释一下为什么我不能使用单词min和max,也不能使用函数double maxx的主要错误以及其他任何错误或警告。

print_nums

3 个答案:

答案 0 :(得分:4)

您使用using namespace std;(摆脱这种习惯),这意味着将std::minstd::maxstd名称空间引入全局名称空间。这就是为什么您不能在自己的代码中使用这些名称的原因,因为它们已经定义。

答案 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 ++的主要功能是类。因此,我建议初学者将精力集中在创建和使用类上,并学习提供的库(等。我进一步建议避免编写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_nummin_num使用更有意义的名称。 如果仍要使用maxmin,请在用户定义的命名空间中声明它们,并在代码中引用它们。