Den*_*nis 6 c++ oop shared-libraries static-libraries
我经历了无法理解的定义的崩溃.
示意图的问题如下:
主项目文件有两个包括:
include <lib1.h>
include <lib2.h>
Run Code Online (Sandbox Code Playgroud)
第一个头包含来自库的其他几个头,其中一个是直接(未覆盖名称空间)定义:
template<typename T> class SparseMatrix;
Run Code Online (Sandbox Code Playgroud)
lib2.h里面有以下内容
namespace lib2
{
using namespace lib3;
class ...
{
...
SparseMatrix<double> ...
...
}
}
Run Code Online (Sandbox Code Playgroud)
在lib3中,用命名空间覆盖,还有SparseMatrix类的定义.
每个库分别编译没有问题.当我尝试编译使用它的可执行文件时,编译器会产生错误:
lib2.h:70:7: error: reference to 'SparseMatrix' is ambiguous
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪,因为我写的主程序中没有任何地方
using namespace lib3;
Run Code Online (Sandbox Code Playgroud)
因此,我认为这些定义不应该崩溃的原因.我非常感谢对此问题的任何可能的解释.
当然,我可以将lib1中的定义包含在它们自己的命名空间中,但是我需要在那里修改很多文件,我宁愿不这样做.
评论:下面的答案是正确的,但我也能够通过改变包含文件的顺序来解决问题,即首先包括lib2,然后是lib1.
我写的主程序中没有任何地方
using namespace lib3;
但是如果你看一下lib2.h,那就是写的.lib3命名空间的内容已经被引入,lib2并且在定义SparseMatrix<double>对象时现在可见.
lib2.h在解决了所有包含后,你可以认为是这样的:
template <typename T> class SparseMatrix; // (1)
namespace lib3
{
template <typename T> class SparseMatrix; // (2)
}
namespace lib2
{
using namespace lib3; // (3)
class ...
{
...
SparseMatrix<double> ... // (4)
// ::SparseMatrix<double> would only see (1)
// lib2::SparseMatrix<double> would only see (2)
}
}
Run Code Online (Sandbox Code Playgroud)
标记为(1)的行声明SparseMatrix在第(4)行立即可见.第(2)行的声明不会,但由于第(3)行将它带入命名空间lib2,它现在也可以在第(4)行看到.
你可以通过完全限定类型来解决这个问题:
::SparseMatrix<double> ...
Run Code Online (Sandbox Code Playgroud)
:: 没有前面的名称空间表示全局名称空间.
另一种方法是不具备using namespace lib3;的lib2.h,正确限定的内容lib3命名空间.
| 归档时间: |
|
| 查看次数: |
6345 次 |
| 最近记录: |