2014-09-17 4 views
0

Я пытаюсь создать собственный класс «Матрица» в C++ и столкнулся с ошибкой «Неопределенные символы для архитектуры x86_64:», которую я не могу понять. Мой соответствующий код это-Неопределенные символы для архитектуры x86_64 C++

HEADER

#ifndef CORE_H 
#define CORE_H 
#include <stdint.h> 

class Size 
{ 
public: 
    Size(const uint64_t nrows, const uint64_t ncols, const uint64_t nframes); 

    uint64_t rows; 
    uint64_t cols; 
    uint64_t frames; 
}; 

template <typename T> 
class Matrix 
{ 
public: 
    Matrix(const uint64_t rows, const uint64_t cols, const uint64_t frames); 
    Matrix(const uint64_t rows, const uint64_t cols, const uint64_t frames, T *data); 

    void print(); 

private: 
    Size sz; 
    T *_data; 
}; 

#endif //CORE_H 

Источник

#include <string.h> 
#include <cstdlib> 
#include <stdio.h> 

#include "core.h" 

Size::Size(const uint64_t nrows, const uint64_t ncols, const uint64_t nframes) 
{ 
    rows = nrows; 
    cols = ncols; 
    frames = nframes; 
} 

template <typename T> 
Matrix<T>::Matrix(const uint64_t rows, const uint64_t cols, const uint64_t frames) 
{ 
    Matrix<T>(rows, cols, frames, malloc(rows * cols * frames * sizeof(T))); 
} 

template <typename T> 
Matrix<T>::Matrix(const uint64_t rows, const uint64_t cols, const uint64_t frames, T *data) 
{ 
    sz = Size(rows, cols, frames); 
    _data = data; 
} 

template <typename T> 
void Matrix<T>::print() 
{ 
    printf("["); 
    for (uint64_t f = 0; f < sz.frames; f++) { 
     printf("["); 
     for (uint64_t r = 0; r < sz.rows; r++) { 
      for (uint64_t c = 0; c < sz.cols; c++) { 
       printf("%.3f,", element(r, c, f)); 
      } 
      printf("\n"); 
     } 
     printf("]\n"); 
    } 
    printf("]\n"); 
} 

TEST

#include "core.h" 

int main(int argc, char *argv[]) 
{ 
    int data[] = { 1, 2, 3, 4, 5, 6, 7, 8}; 
    Matrix<int> mat(2, 2, 2, data); 
    mat.print(); 
    return 0; 
} 

ОШИБКА

Undefined symbols for architecture x86_64: 
    "Matrix<int>::print()", referenced from: 
     _main in rand.cpp.o 
    "Matrix<int>::Matrix(int, int, int, int*)", referenced from: 
     _main in rand.cpp.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [examples/rand] Error 1 
make[1]: *** [examples/CMakeFiles/rand.dir/all] Error 2 
make: *** [all] Error 2 

Я уверен, что это что-то маленькое, но я не могу понять это. Любая помощь могла бы быть полезна!

+0

Добавили ли вы исходный файл в свой проект? Включение '' core.h'' позволяет компилятору понять эти символы, добавив «core.cpp», чтобы компоновщик мог связать их (после компиляции скомпилировал их в объектный код). –

+0

Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – user657267

ответ

1

Функции шаблона (включая функции членов классов шаблонов) должны быть реализованы в заголовочном файле, чтобы их определения (а не только объявления) были видны во всех единицах перевода, где они могли бы использоваться. См. this SO question для получения дополнительной информации.

Переместите определения вашего конструктора и функции print в ваш заголовочный файл, под определением шаблона класса Matrix.

+0

Я исправил его, добавив шаблон шаблона Matrix в нижней части моего .cpp-файла в соответствии с связанным вопросом. Благодаря! – user2465166

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