C++编译器无法找到函数(与命名空间相关)

标签 c++ namespaces operator-keyword

我正在 Visual Studio 2008 中执行 C++ 编程作业。我们提供了定义以下命名空间层次结构的文件(这些名称只是为了这篇文章,我知道“命名空间 XYZ-NAMESPACE”是多余的):

(MAIN-NAMESPACE){

      a bunch of functions/classes I need to implement...

      (EXCEPTIONS-NAMESPACE){

            a bunch of exceptions
      }

      (POINTER-COLLECTIONS-NAMESPACE){

            Set and LinkedList classes, plus iterators
      }
}

MAIN-NAMESPACE 内容被分成一堆文件,由于某种原因,我不明白 Set 和 LinkedList 的运算符 << 完全在 MAIN-NAMESPACE 之外(但在 Set 和 LinkedList 的 header 内)文件)。 这是设置版本:

template<typename T>
std::ostream& operator<<(std::ostream& os, 
                         const MAIN-NAMESPACE::POINTER-COLLECTIONS-NAMESPACE::Set<T>& set)

现在问题是:我有以下数据结构:

Set A
Set B
Set C
double num

它被定义为位于 MAIN-NAMESPACE 内的类中。当我创建该类的实例并尝试打印其中一组时,它告诉我: 错误 C2679:二进制“<<”:找不到采用“const MAIN-NAMESPACE::POINTER-COLLECTIONS-NAMESPACE::Set”类型的右侧操作数的运算符(或者没有可接受的转换)

但是,如果我只编写一个 main() 函数,并创建 Set A、填充它并使用运算符 - 它就可以工作。

知道问题出在哪里吗? (注意:我尝试了我能想到的使用和包含的任何组合)。

最佳答案

奇怪 - 尽管将与类型关联的自由函数放入不同的命名空间是一种不好的做法,但全局命名空间声明始终可见。

我唯一能想到的是 MAIN-NAMESPACE 中同名的声明会隐藏全局命名空间中的一个 - 不是有 operator<< ,可能是完全不相关的类型,在 MAIN-NAMESPACE 中?如果是这样,您应该通过 using ::operator<< 修复该问题声明于MAIN-NAMESPACE 。示例:

namespace A
{
namespace B
{
  class C{};
}

}

void f(A::B::C*);

namespace A
{
  void f(int*); // try commenting
  using ::f; // these two lines
  void g()
  {
    B::C* c;
    f(c);
  }
}

关于C++编译器无法找到函数(与命名空间相关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493985/

相关文章:

xml - 具有命名空间的 XML 属性的 XSD 语法

Yii2 自定义组件命名空间

xml - 在 XSL 翻译中更改 XML 文件的 namespace

c++ - 重载类函数运算符两次作为 setter 和 getter

c++ - image sequence transfer using socket, 菜鸟问题

c++ - 在 C++ 中制作奇数维多维数组的最佳方法?

c++ - CUDA估算2D网格数据的每个 block 的线程数和 block 号

c++ - OpenCL 将字符从全局内存复制到本地内存

python - Counter()+=Counter 和 Counter.update(Counter) 哪个更快?

c++ - 什么 !在值之前初始化变量时做