我有一个“Vector3”类,它已成功编译。它包含非朋友和朋友的功能,例如,重载*和<< Vector3是第二个操作数时的运算符。问题是我无法链接到任何朋友功能,无论运营商是否超载。所以我可以确认错误不是特定于运算符重载。用于链接的g ++命令如下(另请参见最后的Makefile),
g++ -Wall -W -I./ -g -o main.out main.o Vector3.o
发出以下错误,
main.cpp:7: undefined reference to `operator*(double, Vector3 const&)'
main.cpp:9: undefined reference to `mag(Vector3 const&)'
main.cpp:10: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Vector3 const&)'
以下是我的源文件中的相关代码。我遵循为每个班级单独制作.hpp和.cpp的做法。
/* file Vector3.hpp */
struct Vector3 {
...
Vector3 operator*(const double k) const;
friend Vector3 operator*(const double k, const Vector3 &vec);
double magnitude() const;
friend double mag(const Vector3 &vec);
friend std::ostream& operator<<(std::ostream& output, const Vector3 &vec);
...
}
/* file Vector3.cpp */
Vector3 operator*(const double k, const Vector3 &vec) {
...
}
inline double mag(const Vector3 &vec) {
...
}
std::ostream& operator<<(std::ostream& output, const Vector3 &vec) {
...
}
/* file main.cpp */
#include "Vector3.hpp"
int main() {
Vector3 M(1, 1, 1);
M = M * 2.0; // own operator* links successfully
M = 10.0 * M; // friend operator* doesn't link
double m = M.magnitude(); // own function magnitude() links successfully
double n = mag(M); // friend function mag() doesn't link
std::cout << M; // friend operator<< doesn't link
}
最后,这是我的Makefile。
CXX = g++
CXXFLAGS = -Wall -W $(INCPATH) -g
INCPATH = -I./
OBJS = main.o Vector3.o
main.out: $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJS) $(LIBPATH)
main.o: main.cpp
Vector3.o: Vector3.cpp
clean:
rm -f $(OBJS) main.out
最奇怪的是,如果我在main.cpp中包含Vector3.cpp文件,然后从Makefile中的OBJS中删除Vector3.o,程序将成功链接。我无法理解这一点。请帮帮我!!
答案 0 :(得分:1)
朋友operator*
的定义使用fp_type
,而朋友声明使用double
作为第一个参数。如果fp_type
是double
的typedef名称,则此操作只能按预期工作。您确定fp_type
实际上代表double
吗?我无法从您发布的代码中看到它。
mag
的问题非常明显:您在.cpp文件中将其定义为inline
。内联函数定义必须在使用它们的任何地方都可见,这意味着它们通常应放在头文件中。