2009-12-28 4 views
1

У меня есть класс 'Vector3', который скомпилирован. Он содержит как функции, отличные от друга, так и друга, например, для перегрузки * и < < операторов, когда Vector3 является вторым операндом. Проблема в том, что я не могу ссылаться на какую-либо из функций друга, будь то перегрузка оператора или нет. Поэтому я могу подтвердить, что ошибка не связана с перегрузкой оператора. Г ++ используется команда для связывания следующим образом (смотрите пожалуйста 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, а затем удалить Vector3.o из OBJS в Makefile, программные ссылки успешно. Я не могу понять это. Пожалуйста, помогите мне!!

+0

Можете ли вы скопировать и вставить все содержимое vector3.hpp и vector3.cpp? –

+0

Есть много частей этой головоломки, которые отсутствуют. Есть ли у Vector3.hpp защита заголовка? Включает ли Vector3.cpp "Vector3.hpp"? Включен ли какой-либо файл: ? Если в этом вопросе слишком много кода, вы можете сделать меньшую программу, которая показывает эту же ошибку? –

ответ

1

В определении друга operator* используется fp_type, а в объявлении друга используется double в качестве первого параметра. Это будет работать только по назначению, если fp_type является typedef-name для double. Вы уверены, что fp_type на самом деле означает double? Я не вижу этого из кода, который вы опубликовали.

Проблема с mag довольно очевидна: вы определили ее как inline в .cpp файле. Определения встроенных функций должны быть видны везде, где они используются, что означает, что они обычно должны помещаться в файл заголовка.

+0

Ничего. Я нашел свою ошибку и скоро удалю этот вопрос :) – Aamir

+2

@Aamir У меня есть аналогичная проблема, и было бы неплохо, если бы вы разместили решение своей проблемы. Если этот ответ не будет ... но тогда почему говорят «неважно»? – Steve

Смежные вопросы