我正在 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/