У меня есть класс '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, программные ссылки успешно. Я не могу понять это. Пожалуйста, помогите мне!!
Можете ли вы скопировать и вставить все содержимое vector3.hpp и vector3.cpp? –
Есть много частей этой головоломки, которые отсутствуют. Есть ли у Vector3.hpp защита заголовка? Включает ли Vector3.cpp "Vector3.hpp"? Включен ли какой-либо файл:? Если в этом вопросе слишком много кода, вы можете сделать меньшую программу, которая показывает эту же ошибку? –