gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:54 25 4
gpt4 key购买 nike

我正在 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 的标题中文件)。这是设置版本:

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 中的一个类中。当我创建该类的实例并尝试打印其中一组时,它告诉我:error C2679: 二进制“<<”: 没有找到接受类型为“const MAIN-NAMESPACE::POINTER-COLLECTIONS-NAMESPACE::Set”的右手操作数的运算符(或者没有可接受的转换)

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

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

最佳答案

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

我唯一能想到的就是MAIN-NAMESPACE中同名的声明会遮蔽全局 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com