繁体   English   中英

模糊引用和命名空间(来自两个外部库的定义冲突)

[英]Ambiguous reference and namespace (clash of definitions from the two external libraries)

我经历了无法理解的定义的崩溃。

示意图的问题如下:

主项目文件有两个包括:

include <lib1.h>
include <lib2.h>

第一个头包含来自库的其他几个头,其中一个是直接(未覆盖名称空间)定义:

template<typename T> class SparseMatrix;

lib2.h里面有以下内容

namespace lib2
{
   using namespace lib3;

   class ...
   {
      ...
      SparseMatrix<double> ...
      ...
    }
}

在lib3中,用命名空间覆盖,还有SparseMatrix类的定义。

每个库分别编译没有问题。 当我尝试编译使用它的可执行文件时,编译器会产生错误:

lib2.h:70:7: error: reference to 'SparseMatrix' is ambiguous

这对我来说很奇怪,因为我写的主程序中没有任何地方

using namespace lib3;

因此,我认为这些定义不应该崩溃的原因。 我非常感谢对此问题的任何可能的解释。

当然,我可以将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)
    }
}

标记为(1)的行声明SparseMatrix ,它在第(4)行立即可见。 第(2)行的声明不会,但由于第(3) lib2它带入命名空间lib2 ,它现在也在第(4)行可见。

你可以通过完全限定类型来解决这个问题:

::SparseMatrix<double> ...

::没有前面的名称空间表示全局名称空间。

另一种方法是不using namespace lib3; lib2.h并正确限定lib3命名空间的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM