繁体   English   中英

运算符重载-内联非成员函数

[英]operator overloading - inline non-member functions

好的,这样我就可以使我的代码正常工作,但是有些问题困扰着我。 它与操作符重载和使非成员函数内联有关。 这是一个实现复数对象的非常简单的程序:

包含在Complex.h中

using namespace std;

class Complex {
 private:
  double real;
  double imaginary;

 public:

  Complex(void);
  Complex(double r, double i);
  double getReal();
  double getImaginary();
  string toString();
};

inline Complex operator+(Complex lhs, Complex rhs);

...以及Complex.cc中

#include <sstream>
#include <string>
#include "Complex.h"

using namespace std;

Complex::Complex(void)
{
...not important...
}

Complex::Complex(double r, double i)
{
  real = r;
  imaginary = i;
}

double Complex::getReal()
{
  return real;
}

double Complex::getImaginary()
{
  return imaginary;
}

string Complex::toString()
{
...what you would expect, not important here...
}


inline Complex operator+(Complex lhs, Complex rhs)
{
  double result_real = lhs.getReal() + rhs.getReal();
  double result_imaginary = lhs.getImaginary() + rhs.getImaginary();

  Complex result(result_real, result_imaginary);

  return(result);
}

最后在plus_overload_test.cc中

using namespace std;

#include <iostream>
#include "Complex.h"

int main(void)
{
  Complex c1(1.0,3.0);
  Complex c2(2.5,-5.2);

  Complex c3 = c1 + c2;

  cout << "c3 is " << c3.toString() << endl;

  return(0);
}

使用执行链接的makefile使用g ++进行编译会产生错误:

plus_overload_test.cc:(.text+0x5a): undefined reference to `operator+(Complex, Complex)'

如果我只是从Complex.h和Complex.cc中的operator +之前删除“内联”,那么所有内容都会按预期进行编译和运行。 为什么内联修饰符会导致此错误? 每个人,例如:

运算符重载

http://en.cppreference.com/w/cpp/language/operators

似乎建议对于重载二进制运算符,功能应为非成员和内联。 那么,为什么在使它们内联时遇到错误?

而且,是的,我意识到内联修饰符可能是一个红色鲱鱼,因为现代编译器应该注意这一点。 但是我仍然很好奇。

干杯!

inline函数必须在使用它的每个文件中定义。

如果您想要标准中的准确措辞(第7.1.2 / 4节):

内联函数应在使用过的每个翻译单元中定义,并且在每种情况下均应具有完全相同的定义。

标记为inline ,但仅在一个翻译单元中定义,可以说与编译器无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM