C++中一个容易被忽视的名字查找规则
2007-12-10 09:12
246 查看
现在,有下面的代码:
namespace lx1
{
class Point3d
{
public:
Point3d (double dx, double dy, double dz)
: m_dX(dx), m_dY(dy), m_dZ(dz)
{}
double getX() const { return m_dX; };
double getY() const { return m_dY; };
double getZ() const { return m_dZ; };
private:
double m_dX;
double m_dY;
double m_dZ;
};
void TestPoint(const Point3d &pt)
{
cout << "Output from lx1::TestPoint()." << endl;
}
}
namespace lx2
{
void TestPoint(const lx1::Point3d &pt)
{
cout << "Output from lx2::TestPoint()." << endl;
}
void ShowPoint3d(const lx1::Point3d &pt)
{
TestPoint(pt);
cout << "X: " << pt.getX() << endl;
cout << "Y: " << pt.getY() << endl;
cout << "Z: " << pt.getZ() << endl;
}
}
你能发现代码中有什么问题吗?
上面的代码看上去没有什么问题,却不能通过编译,会得到一个“'lx2::TestPoint' : ambiguous call to overloaded function”的错误。也就是说编译器不能确定在ShowPoint3d()函数中调用的是哪个TestPoint()函数。
也许你会非常不解,为什么会出现这样的编译错误。在命名空间lx2中只有一个函数TestPoint(),为什么编译器会不能确定调用哪个TestPoint()函数呢?虽然在命名空间lx1中有一个跟lx2中参数列表相同的TestPoint()函数,可是在命名空间lx2中并没有用using namespace lx1;这样的语句,编译器应该不会去命名空间lx1中去匹配TestPoint()函数呀。
事实上,出现编译错误的原因就是在命名空间lx1和lx2里面都有一个函数列表相同的TestPoint()函数。
在C++中有这样一个名字查找规则--如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。
在上面的代码中,命名空间lx2中的TestPoint()函数参数是lx1::Point3d。按照上面的规则,编译器在查找匹配的函数名字时,也会去包含参数Point3d的名字空间(也就是lx1)中进行匹配查找。而在命名空间lx1中也有一个参数列表跟命名空间lx2中一样的TestPoint()函数,所以会出现上面的编译错误。
这是C++中一条非常容易被忽视的名字查找规则,因此要格外重视。
namespace lx1
{
class Point3d
{
public:
Point3d (double dx, double dy, double dz)
: m_dX(dx), m_dY(dy), m_dZ(dz)
{}
double getX() const { return m_dX; };
double getY() const { return m_dY; };
double getZ() const { return m_dZ; };
private:
double m_dX;
double m_dY;
double m_dZ;
};
void TestPoint(const Point3d &pt)
{
cout << "Output from lx1::TestPoint()." << endl;
}
}
namespace lx2
{
void TestPoint(const lx1::Point3d &pt)
{
cout << "Output from lx2::TestPoint()." << endl;
}
void ShowPoint3d(const lx1::Point3d &pt)
{
TestPoint(pt);
cout << "X: " << pt.getX() << endl;
cout << "Y: " << pt.getY() << endl;
cout << "Z: " << pt.getZ() << endl;
}
}
你能发现代码中有什么问题吗?
上面的代码看上去没有什么问题,却不能通过编译,会得到一个“'lx2::TestPoint' : ambiguous call to overloaded function”的错误。也就是说编译器不能确定在ShowPoint3d()函数中调用的是哪个TestPoint()函数。
也许你会非常不解,为什么会出现这样的编译错误。在命名空间lx2中只有一个函数TestPoint(),为什么编译器会不能确定调用哪个TestPoint()函数呢?虽然在命名空间lx1中有一个跟lx2中参数列表相同的TestPoint()函数,可是在命名空间lx2中并没有用using namespace lx1;这样的语句,编译器应该不会去命名空间lx1中去匹配TestPoint()函数呀。
事实上,出现编译错误的原因就是在命名空间lx1和lx2里面都有一个函数列表相同的TestPoint()函数。
在C++中有这样一个名字查找规则--如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。
在上面的代码中,命名空间lx2中的TestPoint()函数参数是lx1::Point3d。按照上面的规则,编译器在查找匹配的函数名字时,也会去包含参数Point3d的名字空间(也就是lx1)中进行匹配查找。而在命名空间lx1中也有一个参数列表跟命名空间lx2中一样的TestPoint()函数,所以会出现上面的编译错误。
这是C++中一条非常容易被忽视的名字查找规则,因此要格外重视。
相关文章推荐
- C++中一个容易被忽视的名字查找规则
- C++中一个容易被忽视的名字查找规则
- 命名空间 - 一个容易被忽视的查找规则
- sql server一个容易忽视的“漏洞”------SELECT INTO 语句 潜在问题
- C++中的关键概念:名字查找与继承
- 使用SQL Server Business Intelligence Development Studio 2005设计报表模型时的一个容易被忽视的问题
- C++查找一个目录下所有特定扩展名的文件
- C++实现一个栈,出栈,入栈,返回最小值 时间复杂度为O(1),查找字符串中第一个重复出现的字符
- C++12.3 (下) 类作用域中名字查找(局部和全局)
- C/C++——读入一系列由空白分割的(名字,值)对,其中每个名字是由空白分隔开的一个单词,值是一个整数或者一个浮点值, 计算并打印出对应于每个名字的所有值之和与平均值..
- C++中的名字查找
- 浅谈C++继承中的名字查找
- c++ 名字查找
- [导入]Process.Start容易忽视的一个问题
- c++的名字查找
- 学习Drupal一个容易被忽视的问题
- for循环一个容易被忽视的问题
- 一个容易忽视的Oracle安全问题
- 计算机一个很重要但却容易被忽视的概念——堆和栈
- C++中的名字查找