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 ++中的编译错误可能是命名空间问题的主要内容,如果未能解决你的问题,请参考以下文章

“使用命名空间”如何在C ++中工作

C# 中的命名空间常量

databinding错误Error:(11) Error parsing XML: duplicate attribute

如何减轻类声明远离文件中的所有者命名空间声明?

命名空间错误中不存在类型资源

Clojure 中的命名空间之间共享函数