C++ C+中的编译错误+;可能是名称空间问题

C++ C+中的编译错误+;可能是名称空间问题,c++,class,namespaces,C++,Class,Namespaces,我相信我的问题是非常根本的,但我没有找到解决办法。我试过几种变通办法。我得到的错误是一个很长的“没有匹配的函数调用”列表。我很确定这与我如何使用名称空间有关,但从网上看,似乎我的格式设置正确。名称空间是赋值的必要条件,因此我无法删除它 代码: namespace complexSpc{ class complex { public: friend complex operator*(complex &, complex &); }

我相信我的问题是非常根本的,但我没有找到解决办法。我试过几种变通办法。我得到的错误是一个很长的“没有匹配的函数调用”列表。我很确定这与我如何使用名称空间有关,但从网上看,似乎我的格式设置正确。名称空间是赋值的必要条件,因此我无法删除它

代码:

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;
}
由此产生的错误如下所示:

cpp:183:错误:调用“complexPC::complex::complex::complex(complexPC::complex)”时没有匹配的函数

有人问我是否有复制构造函数。我愿意。它在名称空间中声明,定义如下:

complex(complex &);


complexSpc::complex::complex(complexSpc::complex & copy)
{
    member1 = copy.real();
    member2 = copy.imag();
    return;
}

将副本构造函数的签名更改为:

complexSpc::complex::complex(const complexSpc::complex & copy);
complex(complex const &);
允许在运算符定义的返回语句上复制复数的右值

注意操作员签名也必须遵循这一原则,才能在组合操作中使用:

complexSpc::complex complexSpc :: operator*
    ( const complexSpc::complex & first
    , const complexSpc::complex & second
    );
这很可能会修复大部分剩余的错误

cpp:183:错误:调用“complexPC::complex::complex::complex(complexPC::complex)”时没有匹配的函数

您的原始代码包括以下行:

complexSpc::complex t1 = complexSpc::complex(member1 + second.real(), member2 + second.imag());
它构造一个临时文件,然后用它复制构造
t1
。但是,您的副本构造函数声明为:

complex(complex &);
这意味着它不能将临时对象作为参数,因为不允许非常量(左值)引用绑定到临时对象。注意:VisualStudio有一个扩展,它允许临时变量绑定到非常量左值引用,因此它不会捕获此错误

常量引用允许绑定到临时对象,因此如果将复制构造函数更改为:

complexSpc::complex::complex(const complexSpc::complex & copy);
complex(complex const &);
然后,编译器将能够在该错误消息中找到它正在查找的匹配函数

还要注意,代码中还有许多其他函数具有非常量引用参数。这些可能不会导致错误,因为您没有将这些函数用于临时工具,但为了使用临时工具,它们也必须进行更新


complexNumbers.cpp:182:错误:“complexPC::complexPC::operator*(complexPC::complex&,complexPC::complex&)”应该在“complexPC”中声明

我相信这实际上是编译器中的一个bug。类中的友元声明应该足够了,但是gcc并没有在所有情况下都正确地处理它。一种解决方法是在类之外声明第二次出错的友元函数:

namespace N {
  class C {
    friend void f();
  };
  void f(); // workaround.
}
void N::f() {}

将其减少为1个操作员,并张贴错误。减少。很抱歉,看起来您只是缺少了
complex
的复制构造函数的定义。同样对于实现文件,我认为可以说
使用名称空间complexSpc在开始时,而不是在每个实现上重复它。这是我的复制构造函数:complex(complex&);complexSpc::complex::complex(complexSpc::complex©){member1=copy.real();member2=copy.imag();return;}您必须使用
complex(const complex&rhs)
作为复制构造函数的签名(不需要
return
)。我尝试在大括号中定义它,但它没有修复任何问题。现在错误减少了很多。我现在从文本墙中看到的内容几乎都是这样的:complexNumbers.cpp:182:error:“complexPC::complexPC::operator*(complexPC::complexPC&,complexPC::complexPC&)应该在“complexPC”中声明。正如您所说,我更改了构造函数,但我也必须更改定义吗?对不起,我是这方面的初学者是的!当然,他们总是有一致的签名。但这看起来和你在我未经训练的眼睛里写的一模一样。我希望我能粘贴整个代码和整个错误列表。修复复制构造函数会修复所有错误吗?这些错误只是一长串相同的东西,这就是我怀疑名称空间问题的原因。在我的评论中做得对,但不是为了答案。修好了!那么仅仅是const这个词?