成员函数定义没有使用声明""在cpp文件中

时间:2015-03-19 15:31:39

标签: c++11

项目中有一个round函数位于一个单独的命名空间中:

namespace CMMN
{
   inline long round (double x) { return long (x < 0. ? x-0.5 : x+0.5); }
}

某个类在* .h文件中声明,并且它的成员函数在单独的* .cpp文件中定义:

using CMMN::round;

long SOME_CLASS::MemberFunction()
{
   return round(sqrt(m_SomeValue));
}

问题是编译器生成错误:

error C2668: 'CMMN::round' : ambiguous call to overloaded function
          ...\commdef.h(222): could be 'long CMMN::round(double)'
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1241): or       'long double round(long double) throw()'
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1125): or       'float round(float) throw()'
          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(516): or       'double round(double)'
          while trying to match the argument list '(double)'
  • 我想知道为什么在cpp文件开头的ussing声明呢 不影响下面的memeber函数定义?
  • 有办法吗? 在成员函数定义中看到使用声明? 为每个函数定义添加使用声明是一个决定,但它几乎等同于完全限定的round调用。

提前致谢。

2 个答案:

答案 0 :(得分:1)

确实会影响它。编译器告诉你它可以调用4个候选函数,并且它不知道要调用哪个函数。其中一个候选者是CMMN :: round,它表明正在识别使用声明。

您必须消除您打算呼叫的round()消息。

答案 1 :(得分:0)

命名空间中的

using CMMN::round仅使该符号在所述命名空间内可见;它会影响绑定首选项。

您似乎还在某处包含了<cmath><math.h>,这也声明了round的重载。

您必须在函数定义中使用声明,或者在使用它们的地方完全限定它们的名称。