代码之家  ›  专栏  ›  技术社区  ›  Aamir

链接到朋友函数时出错

  •  1
  • Aamir  · 技术社区  · 16 年前

    我有一个'vector3'类 编译的 成功。它同时包含非友元和友元函数,例如,当vector3是第二个操作数时重载*和<<运算符。问题是我不能链接到任何friend函数,不管它是否是操作符重载的。所以我可以确认这个错误不是特定于运算符重载的。用于链接的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,那么程序将成功链接。我搞不懂。请帮帮我!!

    1 回复  |  直到 16 年前
        1
  •  1
  •   AnT stands with Russia    16 年前

    朋友的定义 operator* 使用 fp_type 而朋友声明使用 double 作为第一个参数。只有当 FPY型 是的typedef名称 双重的 . 你确定吗? FPY型 实际上代表 双重的 ?从你发的代码看不出来。

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