我在这里有一个正常的数字课程:
number.hpp
#ifndef NUMBER_HPP
#define NUMBER_HPP
#include <memory>
class Number
{
private:
std::unique_ptr<int[]> mDigits;
public:
// CONSTRUCTORS \\
Number();
};
#endif
number.cpp
#include "number.hpp"
#define PRECISION 2048
Number::Number()
:mDigits( new int[PRECISION]() )
{
}
当我添加以下运算符
时number.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
number.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
对于班级中的每个方法都是如此。这里发生了什么?
答案 0 :(得分: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;
然后将其解析为两条注释和一条声明,
bool operator!=( Number const& rhs ) const;
解决方案:不要将\
用作一行中的最后一个字符。只需撰写// CONSTRUCTORS
或// CONST OPERATORS
。
答案 1 :(得分:0)
评论中的\\会开始多行评论(请参阅here)。这会导致这两个函数(默认构造函数和运算符==)的声明真正成为头文件中的注释。