-1
1 개 종료 상태 정의되지 않은 참조를 반환 오류 LD 내가 DevC++ 5.11을 사용하고 있는데 나는 5 개 파일이있는 프로젝트를
matrix.cpp
matrix.h
,321 0 다음 오류가 발생합니다.[Error] ld returned 1 exit status
mainDistances.cpp: undefined reference to `Matrix<float>::operator=(Matrix<float> const&)'
mainDistances.cpp:(.text+0xb5f): undefined reference to `Matrix<float>::rows()'
[...]\distances.o distances.cpp:(.rdata$_ZTV6MatrixIiE[_ZTV6MatrixIiE]+0x18): undefined reference to `Matrix<int>::readMatrix(std::string const&)'
AND MORE
거의 모든 것이 정의되지 않은 것처럼 보입니다. 마치 다른 파일을 읽지 않는 것과 같습니다.
# Project: mainDistances
# Makefile created by Dev-C++ 5.11
CPP = g++.exe
CC = gcc.exe
WINDRES = windres.exe
OBJ = distances.o mainDistances.o matrix.o
LINKOBJ = distances.o mainDistances.o matrix.o
LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc
INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN = mainDistances.exe
CXXFLAGS = $(CXXINCS) -std=c++11
CFLAGS = $(INCS) -std=c++11
RM = rm.exe -f
.PHONY: all all-before all-after clean clean-custom
all: all-before $(BIN) all-after
clean: clean-custom
${RM} $(OBJ) $(BIN)
$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
distances.o: distances.cpp
$(CPP) -c distances.cpp -o distances.o $(CXXFLAGS)
mainDistances.o: mainDistances.cpp
$(CPP) -c mainDistances.cpp -o mainDistances.o $(CXXFLAGS)
matrix.o: matrix.cpp
$(CPP) -c matrix.cpp -o matrix.o $(CXXFLAGS)
파일은 각각 그래서 난이 게시물 거대한 만들려고하고 있지 않다 거의 200 행을 가지고 있지만, 일부 다른 코드 부품을 필요로하는 경우에 저에게 알려주십시오.
distances.h
#ifndef DISTANCES_H
#define DISTANCES_H
#include "matrix.h"
template<class T>
class Distances : public Matrix<T> {
public:
using Matrix<T>::matr_;
using Matrix<T>::mRows;
using Matrix<T>::mCols;
using Matrix<T>::operator+;
using Matrix<T>::operator+=;
using Matrix<T>::operator=;
Distances(size_t first, size_t second) : Matrix<T>(first, second) {};
Distances(size_t first, size_t second, T value) : Matrix<T>(first, second, value) {};
//Costruttore senza parametri. Vengono utilizzati quelli di Matrix
Distances(void) : Matrix<T>() {};
//Costruttori che permettono il confronto
static bool equal(const Distances<T>& , const Distances<T>&);
bool operator == (const Distances<T>& rsh) const;
//Costruttori di lettura, scrittira e stampa della Matrice
void readMatrix (const std::string &filename = "distIn.txt");
void writeMatrix(const std::string &filename = "distOut.txt");
void print(const std::string s);
//Ridefinizione dell'operatore *
virtual Distances<T>& operator*(const Distances<T>&);
//Costruttori delle funzioni che risolvono il minPath
static Distances<T> minPathFunct(const Distances<T>&, int y);
static Distances<T> minPathFW(const Distances<T>& , int y);
};
#endif
#include "distances.h"
/** Funzione che ci permette di leggere la Matrice del file **/
template <class T>
void Distances<T>::readMatrix(const std::string &filename) {
std::ifstream file;
file.open(filename, std::ios::in); //Apriamo il file
//Controlliamo la presenza del file
if(!file.is_open()) {
std::cout << "Could not open file " << filename << std::endl;
return;
}
//Dichiariamo le variabili utili per l'estrazione dei valori della Matrice
std::string line, str;
T value;
int rows = 0;
//Ciclo while che ci permette di estrarre i valori matriciali dalle n-righe
while(std::getline(file, line)) {
std::istringstream iss(line);
rows++;
int cols = 0;
//Ciclo while che estrae ogni valore di una riga
while(iss >> str) {
cols++;
if (str=="*") value = std::numeric_limits<T>::max();
else value = stof(str);
matr_.push_back(value);
}
mCols = cols;
}
mRows = rows;
}
/** Funzione di scrittura della Matrice ottenuta in un file di testo **/
template <class T>
void Distances<T>::writeMatrix(const std::string &filename) {
//Apertura del file
std::ofstream file;
file.open(filename, std::ios::out);
if(!file.is_open()) {
std::cout << "Could not open file " << filename << std::endl;
return;
}
T value;
std::string str;
//Cicli for che ci permettono il salvataggio del valore M[i][j] nel file testo
for (int i=0;i<mRows;i++) {
for(int j=0;j<mCols;j++) {
value = matr_[i*mRows + j];
str =std::to_string(value);
if (value == std::numeric_limits<T>::max()) str = "*";
file << std::setw(7) << str << " ";
}
file << endl;
}
//Chiusura del file
file << endl;
file.close();
}
[...]
template class Distances<int>;
template class Distances<float>;
[템플릿을 헤더 파일에만 구현할 수있는 이유는 무엇입니까?] (https://stackoverflow.com/questions/495021)/왜 - 헤더 파일에 템플릿 만 가능) – user0042
@ user0042 문제가 어떻게 해결되는지 모르겠 음 – lory2l
분명히 템플릿 클래스 정의는 별도의 번역 단위로 구현했습니다. 사용 된 모든 템플릿 매개 변수 유형을 전문으로하지 않는 한 링커는 누락 된 정의에 대해 불만을 제기합니다. – user0042