C++:当我定义运算符时,所有成员函数都会给出隐式定义错误

Posted

技术标签:

【中文标题】C++:当我定义运算符时,所有成员函数都会给出隐式定义错误【英文标题】:C++: All Member Functions Give Implicit Definition Error When I Define Operators 【发布时间】:2017-02-02 10:46:38 【问题描述】:

我这里有一个可以正常工作的数字类:

数字.hpp

#ifndef NUMBER_HPP
#define NUMBER_HPP

#include <memory>

class Number

private:
     std::unique_ptr<int[]> mDigits;
public:
     // CONSTRUCTORS \\
     Number();
;

#endif

数字.cpp

#include "number.hpp"

#define PRECISION 2048

Number::Number()
    :mDigits( new int[PRECISION]() )


当我添加以下运算符时

数字.hpp

#ifndef NUMBER_HPP
#define NUMBER_HPP

#include <memory>

class Number

private:
     std::unique_ptr<int[]> mDigits;
public:
     // CONSTRUCTORS \\
     Number();

     // CONST OPERATORS \\
     bool operator==( Number const& rhs ) const;
     bool operator!=( Number const& rhs ) const;
;

#endif

数字.cpp

#include "number.hpp"

#define PRECISION 2048

Number::Number()
    :mDigits( new int[PRECISION]() )



bool Number::operator==( Number const& rhs ) const  

    for( int i = 0; i < PRECISION; ++i )
        if( mDigits[i] != rhs.mDigits[i] )
            return false;
    return true;


bool Number::operator!=( Number const& rhs ) const

    return !( *this == rhs );

我从 GCC 5.4、GCC 6.2 和 CLANG idk 收到以下错误

number.cpp:5:16: error: definition of implicitly declared constexpr Number::Number()
Number::Number()

error: number.cpp:12 no bool Number::operator==( const Number& rhs ) const member function declared in class Number

类中的每个方法等等。这里发生了什么?

【问题讨论】:

签名不应该是bool operator==( const Number&amp; rhs ) const;吗? 我只是把它们调换一下,看看这种方式是否可行。我认为它们是可以互换的。但两者都不起作用。 不要总结不起作用的代码。 //same as before 经常隐藏错误。发布显示错误的实际代码。 编辑过的number.cpp 您可以尝试删除 \\ 吗? 【参考方案1】:
public:
     // CONSTRUCTORS \\
     Number();

     // CONST OPERATORS \\
     bool operator==( Number const& rhs ) const;
     bool operator!=( Number const& rhs ) const;

预处理器会在处理的早期删除所有出现的反斜杠换行符(即在行尾的\)。你最终得到的是:

public:
     // CONSTRUCTORS \         Number();

     // CONST OPERATORS \         bool operator==( Number const& rhs ) const;
     bool operator!=( Number const& rhs ) const;

然后将其解析为两个 cmets 和一个声明,

     bool operator!=( Number const& rhs ) const;

解决方案:不要使用\ 作为一行中的最后一个字符。只需写// CONSTRUCTORS// CONST OPERATORS

【讨论】:

真可惜,它看起来真漂亮。不过谢谢你,我的 cmets 是我最后去看的地方。 @cp420 如果你想要对称的 cmets 在开头和结尾都有装饰,为什么不使用/* CONSTRUCTORS */? :-)【参考方案2】:

您的 cmets 中的 \\ 开始一个多行注释(请参阅 here)。这会导致这两个函数(默认构造函数和 operator==)的声明实际上是头文件中的 cmets。

【讨论】:

以上是关于C++:当我定义运算符时,所有成员函数都会给出隐式定义错误的主要内容,如果未能解决你的问题,请参考以下文章

C++拷贝控制含有指针成员的类

C++要点总结

c++ 拷贝构造函数与赋值运算符重载函数的区别是

C++之类之类的作用域

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载

C++ 隐式生成的赋值运算符的异常安全性