2013-02-16 7 views
0

Я пишу шаблон матрицы для школьного задания. Я включил эту ошибку, а также файлы источника и заголовка ниже. Я не думаю, что с моим кодом что-то не так, я уверен, что по какой-то причине xcode не распознает заголовок и исходный файл. Матричный класс tempmlated объявлен в Matrix.h, определения функций находятся в Matrix.cpp, а основная процедура - main.cpp. Я включил все три файла, а также полное сообщение об ошибке, которое Xcode дает мне ниже. Последние 2 дня я провел за эту ошибку безрезультатно. Я очень новичок в xcode, поэтому любая помощь действительно ценится. Если вам нужно, чтобы я опубликовал дополнительную информацию, например, мои настройки или что-то еще, не стесняйтесь спрашивать. Благодаря ПОЛНАЯ Ошибка:Ошибка Xcode: Неопределенные символы для архитектуры x86_64

Ld /Users/Mikey/Library/Developer/Xcode/DerivedData/hw3-glwfyunpxigvvpfacidnbejyprfa/Build/Products/Debug/hw3  normal x86_64 
cd /Users/Mikey/Desktop/programming/PIC10B/hw3 
setenv MACOSX_DEPLOYMENT_TARGET 10.8 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 - isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/Mikey/Library/Developer/Xcode/DerivedData/hw3-glwfyunpxigvvpfacidnbejyprfa/Build/Products/Debug -F/Users/Mikey/Library/Developer/Xcode/DerivedData/hw3-glwfyunpxigvvpfacidnbejyprfa/Build/Products/Debug -filelist /Users/Mikey/Library/Developer/Xcode/DerivedData/hw3-glwfyunpxigvvpfacidnbejyprfa/Build/Intermediates/hw3.build/Debug/hw3.build/Objects-normal/x86_64/hw3.LinkFileList -mmacosx-version-min=10.8 -stdlib=libc++ -o /Users/Mikey/Library/Developer/Xcode/DerivedData/hw3-glwfyunpxigvvpfacidnbejyprfa/Build/Products/Debug/hw3 

Undefined symbols for architecture x86_64: 
"operator^(Matrix<double>, int)", referenced from: 
    _main in main.o 
"operator>>(std::__1::basic_istream<char, std::__1::char_traits<char> >&, Matrix<double>&)", referenced from: 
    _main in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation)` 



//main.cpp 
#include<iostream> 
#include<vector> 
#include<string> 
#include "Matrix.h" 

using namespace std; 

int main() { 
int numberOfPlanets; 
int steps; 
string planet; 
vector<string> planetNames; 
Matrix<double> markovMatrix; 
Matrix<double> stepMatrix; 

cout<<"Please enter the number of Planets:"; 
cin>>numberOfPlanets; 
cout<<"Please enter the names of the Planets:"; 
for(int i=0;i<numberOfPlanets;i++) { 
    cin>>planet; 
    planetNames.push_back(planet); 
} 

cout<<"How many steps will you take?"; 
cin>>steps; 

cout<<"Please enter the "<<numberOfPlanets<<"X"<<numberOfPlanets<<" Markov Matrix:"; 
cin>>markovMatrix; 

stepMatrix=markovMatrix^steps; 

for(int i=0;i<numberOfPlanets;i++) { 
    int maxEntry = stepMatrix.findMax(i); 
    cout<<"After "<<steps<<" steps, from "<<planetNames[i]<<"you are most likely to end up at "  <<planetNames[maxEntry]; 
    cout<<endl; 
} 





return 0; 

} 


//Matrix.h 
#include<iostream> 
#include<iomanip> 

#ifndef MATRIX_H 
#define MATRIX_H 

using namespace std; 



template<typename T> 
class Matrix { 
public: 
    Matrix(); 
    Matrix(int r, int c); 
    ~Matrix(); 
    Matrix<T>(const Matrix<T>& right); 
    Matrix<T>& operator=(const Matrix<T>& right); 
    T& operator() (int i, int j); 
    T operator() (int i, int j) const; 
    friend ostream& operator<<(ostream& out, const Matrix<T>&right); 
    friend istream& operator>>(istream& in, Matrix<T>& right); 
    friend Matrix<T> operator*(const Matrix<T> left, const Matrix<T> right); 
    friend Matrix<T> operator+(const Matrix<T> left, const Matrix<T> right); 
    friend Matrix<T> operator^(const Matrix<T> right, int power); 
    int findMax(int r) const; 
private: 
    int rows; 
    int columns; 
    T* elements; 
}; 

#endif` 




//Matrix.cpp 
#include "Matrix.h" 
#include<iostream> 
#include<iomanip> 

using namespace std; 

template<typename T> 
    Matrix<T>::Matrix() { 
    rows = 0; 
    columns = 0; 
    elements = NULL; 
} 

template<typename T> 
Matrix<T>::Matrix(int r, int c) { 
    rows = r; 
    columns = c; 
    elements = new T[rows*columns]; 
    for(int i=0;i<rows*columns;i++) { 
    elements[i]=0; 
    } 
} 

template<typename T> 
Matrix<T>::Matrix(const Matrix<T>& right) { 
    rows = right.rows; 
    columns = right.columns; 
    elements = new T[rows*columns]; 

    for(int i=0;i<rows*columns;i++) 
    elements[i]=right.elements[i]; 

} 

template<typename T> 
Matrix<T>& Matrix<T>::operator=(const Matrix<T>& right) { 
    if(this!=&right) { 
     rows = right.rows; 
     columns = right.columns; 
     delete[] elements; 
     for(int i=0;i<rows*columns;i++) { 
      elements[i]=right.elements[i]; 
     } 
    } 

    return *this; 
} 

template<typename T> 
T Matrix<T>::operator()(int i, int j) const { 
    return elements[i*rows+j]; 
} 

template<typename T> 
T& Matrix<T>::operator()(int i, int j) { 
    return elements[i*rows+j]; 
} 

template<typename T> 
Matrix<T> operator+(const Matrix<T>& right, const Matrix<T> left) { 
    Matrix<T> A(right.rows, right.columns); 
    for(int i=0;i<A.rows;i++) { 
     for(int j=0;j<A.columns;j++) { 
      A(i,j) = right(i,j)+left(i,j); 
     } 
    } 

    return A; 
} 

template<typename T> 
Matrix<T> operator*(const Matrix<T>& right, const Matrix<T> left) { 
    Matrix<T> A(left.rows, right.columns); 
    for(int i=0;i<left.rows;i++) { 
     for(int j=0;j<right.columns;j++) { 
      for(int k=0;k<right.rows;k++) { 
       A(i,j)+=left(i,k)*right(k,j); 
      } 
     } 
    } 

    return A; 
} 

template<typename T> 
Matrix<T>::~Matrix() { 
    delete[] elements; 
} 

template<typename T> 
Matrix<T> operator^(const Matrix<T>& right, int power) { 
    Matrix<T> A = right; 
    for(int i=1;i<power;i++) 
     A=A*right; 
    return A; 
} 

template<typename T> 
int Matrix<T>::findMax(int r) const { 
    int maxColumnEntry = 0; 
    T rowMax = elements[r*columns]; 
    for(int j=1;j<columns;j++) { 
     if(elements[r*columns+j]>rowMax) { 
      rowMax = elements[r*columns+j]; 
      maxColumnEntry = j; 
     } 
    } 

    return maxColumnEntry; 
} 

template<typename T> 
ostream& operator<<(ostream& out,const Matrix<T>& right) { 
    for(int i=0;i<right.rows*right.columns;i++) { 
     out<<setw(10)<<right.elements[i]<<" "; 
     if((i+1)%right.columns==0) 
      out<<endl; 
    } 
    return out; 
} 

template<typename T> 
istream& operator<<(istream& in, Matrix<T>& right) { 
    for(int i=0;i<right.rows*right.columns;i++){ 
     in>>right.elements[i]; 
    } 

    return in; 
} 
+0

Знайте, что ваши подписи функции не совпадают: то есть 'оператор^(сопз Matrix право, внутр мощности)' в определение класса (где 'const' ничего не делает BTW) по сравнению с:' operator^(const Matrix & right, int power) 'в реализации шаблона функции. –

+0

Спасибо, я изменил это. Тем не менее, я все еще получаю ту же ошибку – Mishiko

+0

Это два месяца спустя - вы когда-нибудь находили решение? У меня точно такая же проблема. xcode не связывается. Он правильно компилирует мой код, и ошибка исчезает, если я #include также файлы cpp (потому что ему не нужно ссылаться, поскольку все символы определены в файле main.cpp), но это не решение. –

ответ

2

Я считаю, что вы компиляцию с неправильным Lib. измените свои настройки сборки, чтобы использовать: Compiler Default в настройках компилятора Apple LLVM, возможно, даже libstdC++.

И:

Project -> Build Settings -> Поиск LLVM Compiler группа -> C++ Стандартная библиотека

+0

Я уже установил libC++. Я попробовал оба варианта, и у меня все еще была та же ошибка. – Mishiko

+0

Ух, подумал, что это будет что-то простое. Я загружу macbook, когда вернусь в свой дом, и посмотрю, смогу ли я его отследить. – Holyprin

+0

Ха-ха, я думаю, ты прав, что просто не уверен, что это такое. Большое спасибо за Вашу помощь! – Mishiko

0

Если вы создаете программу на С или C++?

Если C++, строить с G ++ или Xcode TYPE проекта = C++, а не С.

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