1

我有一个成功编译的类'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,则程序链接成功。我无法理解这一点。请帮我!!

4

1 回答 1

1

朋友的定义operator*使用fp_type而朋友声明double用作第一个参数。仅当fp_type它是double. 你确定fp_type真的代表double吗?从您发布的代码中我看不到它。

问题mag相当明显:您将其定义为inline.cpp 文件。内联函数定义在使用它们的任何地方都必须可见,这意味着通常它们应该放在头文件中。

于 2009-12-28T02:17:37.770 回答