2017-12-17 13 views
-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>; 
+0

[템플릿을 헤더 파일에만 구현할 수있는 이유는 무엇입니까?] (https://stackoverflow.com/questions/495021)/왜 - 헤더 파일에 템플릿 만 가능) – user0042

+0

@ user0042 문제가 어떻게 해결되는지 모르겠 음 – lory2l

+0

분명히 템플릿 클래스 정의는 별도의 번역 단위로 구현했습니다. 사용 된 모든 템플릿 매개 변수 유형을 전문으로하지 않는 한 링커는 누락 된 정의에 대해 불만을 제기합니다. – user0042

답변

-1

당신의 코드는 아마도 math.h라는 distaces.cpp, becusse C++ 기본이 libc.so라고 (이 -lc 추가 할 필요가 없습니다 매개 변수) .math.h를 호출 한 경우 libm.so를 추가하려면 "-lm"을 추가해야합니다. 도움이 될 수 있기를 바랍니다. 내 영어가 매우 나쁘다. 미안하다 ...