好的,所以我可以让我的代码工作,但是有些东西让我烦恼。它与运算符重载和内联非成员函数有关。这是一个非常简单的程序,它实现了一个复数对象:
包含在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 +之前删除“inline”,那么一切都会编译并按预期工作。为什么内联修饰符会导致此错误?每个人,例如:
和
http://en.cppreference.com/w/cpp/language/operators
似乎建议对于重载二元运算符,函数应该是非成员和内联函数。那么为什么我在内联时会遇到错误?
而且,是的,我意识到内联修饰符可能是一个红色鲱鱼,因为现代编译器应该处理这个问题。但我仍然很好奇。
干杯!
答案 0 :(得分:1)
必须在每个使用它的文件中定义inline
函数。
如果您需要标准(第7.1.2 / 4节)中的准确措辞:
内联函数应在每个使用过的翻译单元中定义,并且在每种情况下都应具有完全相同的定义。
如果它标记为inline
,但只在一个翻译单元中定义,那么您就不会与编译器达成合同(可以这么说)。