2009-12-28 26 views
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 [email protected] $(OBJS) $(LIBPATH) 

main.o: main.cpp 
Vector3.o: Vector3.cpp 

clean: 
rm -f $(OBJS) main.out 

最奇怪的是,如果我包括Vector3.cpp文件,以及在main.cpp中,然後從OBJS Makefile中刪除Vector3.o,程序鏈接成功。我無法理解這一點。請幫幫我!!

+0

你能複製並粘貼vector3.hpp和vector3.cpp的全部內容嗎? – 2009-12-28 02:17:55

+0

這個謎題有很多部分都是缺失的。 Vector3.hpp是否有頭部守衛? Vector3.cpp是否包含「Vector3.hpp」?有沒有文件包含?如果有太多的代碼將所有這些問題都放在這個問題上,你可以製作一個更小的程序來顯示相同​​的錯誤嗎? – 2009-12-28 02:36:27

回答

1

朋友的定義operator*使用fp_type而朋友聲明使用double作爲第一個參數。如果fp_typedouble的typedef名稱,則這隻能按預期工作。你確定fp_type實際上代表double?我無法從您發佈的代碼中看到它。

mag的問題很明顯:您在.cpp文件中將其定義爲inline。內聯函數定義在使用它們的任何地方都必須是可見的,這意味着它們通常應該放在頭文件中。

+0

沒關係。我發現我的錯誤,並將很快刪除這個問題:) – Aamir 2009-12-28 02:36:56

+2

@Aamir我有一個類似的問題,這將是很好,如果你發佈的解決方案,你的問題。除非這個答案是......但是爲什麼說「沒關係」呢? – Steve 2014-08-12 17:28:08