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& 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++:当我定义运算符时,所有成员函数都会给出隐式定义错误的主要内容,如果未能解决你的问题,请参考以下文章