C ++中的编译错误可能是命名空间问题
Posted
技术标签:
【中文标题】C ++中的编译错误可能是命名空间问题【英文标题】:Compilation error in C++ Possibly Namespace problems 【发布时间】:2013-11-22 16:09:11 【问题描述】:我相信我的问题非常根本,但我没有找到解决方案。我尝试了几种解决方法。我得到的错误是一个很长的“没有匹配的函数调用”列表。我很确定这与我使用命名空间的方式有关,但在网上看似乎我的格式正确。命名空间的东西是分配的要求,所以我不能删除它。
代码:
namespace complexSpc
class complex
public:
friend complex operator*(complex &, complex &);
;
在我的程序底部,我定义了我的班级成员。它们不在命名空间块内。我试图这样做,但它没有解决任何问题。我还尝试移动定义,以便在声明时定义它们。
complexSpc::complex complexSpc :: operator*(complexSpc::complex & first, complexSpc::complex & second)
complexSpc::complex t1 = complexSpc::complex(first.real() * second.real(), first.imag() * second.imag());
return t1;
为此产生的错误是这样的:
complexFix.cpp:183:错误:没有匹配函数调用‘complexSpc::complex ::complex(complexSpc::complex)’
有人问我是否有复制构造函数。我愿意。它在命名空间中声明并定义如下:
complex(complex &);
complexSpc::complex::complex(complexSpc::complex & copy)
member1 = copy.real();
member2 = copy.imag();
return;
【问题讨论】:
将其减少到 1 个操作员并发布错误。 减少。对此感到抱歉 看起来您只是缺少complex
的复制构造函数的定义。同样对于实现文件,我认为在开始时说using namespace complexSpc;
是可以的,而不是在每个实现上都重复它。
这是我的复制构造函数:complex(complex &); complexSpc::complex::complex(complexSpc::complex & copy) member1 = copy.real(); member2 = copy.imag();返回;
您必须使用complex(const complex& rhs)
作为复制构造函数的签名(不需要return
)。
【参考方案1】:
将复制构造函数的签名更改为:
complexSpc::complex::complex(const complexSpc::complex & copy);
允许在您的运算符定义的返回语句中复制复杂的右值。
注意,您还必须为您的操作员签名坚持这一原则,以便能够在组合操作中使用它们:
complexSpc::complex complexSpc :: operator*
( const complexSpc::complex & first
, const complexSpc::complex & second
);
这很可能会解决您剩下的大部分错误。
【讨论】:
我按照你说的改变了构造函数,但是我也必须改变定义吗?抱歉,我是这方面的初学者 是的!当然,它们必须始终具有一致的签名。 但它看起来和你写给我未经训练的眼睛的一样。我希望我可以粘贴整个代码和整个错误列表。修复复制构造函数会修复所有错误吗?这些错误只是一长串相同的事情,这就是我怀疑命名空间问题的原因 对不起,你是对的。在我的评论中是否正确,但不是为了答案。修好了! 所以只有 const 这个词?【参考方案2】:complexFix.cpp:183: error: no matching function for call to ‘complexSpc::complex ::complex(complexSpc::complex)’
您的原始代码包括以下行:
complexSpc::complex t1 = complexSpc::complex(member1 + second.real(), member2 + second.imag());
构造一个临时的,然后用它复制构造t1
。但是,您的副本构造函数已声明:
complex(complex &);
这意味着它不能将临时对象作为参数,因为不允许非常量(左值)引用绑定到临时对象。 注意:Visual Studio 有一个扩展,它允许临时对象绑定到非 const 左值引用,所以它不会捕获这个错误。
允许常量引用绑定到临时对象,所以如果你将复制构造函数更改为:
complex(complex const &);
然后编译器将能够在该错误消息中找到它正在寻找的匹配函数。
另请注意,您的代码中还有许多其他函数具有非常量引用参数。这些可能不会导致错误,因为您没有将这些函数与临时变量一起使用,但它们也必须更新才能与临时变量一起使用。
complexNumbers.cpp:182: error: 'complexSpc::complex complexSpc::operator*(complexSpc::complex&, complexSpc::complex&)' 应该在'complexSpc' 中声明
我相信这实际上是编译器中的一个错误。类中的友元声明应该足够了,但是 gcc 似乎在所有情况下都不能正确处理。一种解决方法是在类之外声明它第二次出错的友元函数:
namespace N
class C
friend void f();
;
void f(); // workaround.
void N::f()
【讨论】:
我尝试在大括号内定义它,但没有解决任何问题 现在错误少了很多。我现在从文字墙上看到的几乎都是这样的: complexNumbers.cpp:182: error: 'complexSpc::complex complexSpc::operator*(complexSpc::complex&, complexSpc::complex&)' 应该有在“complexSpc”中声明以上是关于C ++中的编译错误可能是命名空间问题的主要内容,如果未能解决你的问题,请参考以下文章
databinding错误Error:(11) Error parsing XML: duplicate attribute