简体   繁体   中英

Undefined symbols for architecture x86_64 c++

I am trying to create a custom 'Matrix' class in C++ and have run into an "Undefined symbols for architecture x86_64:" error that I cannot understand. My relevant code is-

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

SOURCE

#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;
}

ERROR

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

I'm sure it is something small but I can't figure it out. Any help would be really appreciated!

Template functions (including member functions of template classes) need to be implemented in a header file so their definitions (not just declarations) are visible in all translation units where they might be used. See this SO question for more information.

Move the definitions of your constructor and print functions into your header file, below the definition of the Matrix class template.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM