этап компоновщика: неопределенная ссылка - PullRequest
1 голос
/ 12 июля 2011

Я уже прочитал здесь 15 неопределенных справочных тем и использовал Google, чтобы найти правильный ответ, но не тот, который действительно помог.

Я написал 1D и 2D простой класс хранения, который позволяет быстро проходить через прямой доступ к данным (плюс некоторые удобные средства доступа). Здесь идет 1D (2D почти такой же, просто 2D)

Заголовок:

#ifndef MULTI1_H
#define MULTI1_H
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

template <class T>
class Multi1
{
public:
    Multi1(int32_t size_ = -1);
    ~Multi1();
    void set(T val, int32_t pos);
    T& operator[] (int32_t pos) const;
    T& at(int32_t pos) const;
    int32_t m_size;
    T *m_data;
};

#endif // MULTI1_H

Body:

#include "multi1.h"

template <class T>
Multi1<T>::Multi1(int32_t size_) :
  m_size(size_),
  m_data(NULL)
{
  if (size_>0)
    m_data = (T *) malloc (sizeof(T)*size_);
  else
     m_size = 0;
}

template <class T>
Multi1<T>::~Multi1()
{
  if (m_data!=NULL)
    free (m_data);
}

template <class T>
void Multi1<T>::set(T val, int32_t pos)
{
  m_data[pos] = val;
}

template <class T>
T& Multi1<T>::operator[](int32_t pos) const
{
  return m_data[pos];
}

template <class T>
T& Multi1<T>::at(int32_t pos) const
{
  return m_data[pos];
}


./build/main.o: In function `setupDemo(Multi1<voCam*>&, Multi1<voBoard*>&, Multi2<voBoardObservation*>&)':
./src/main.cpp:32: undefined reference to `Multi1<voCam*>::operator[](int) const'
./src/main.cpp:31: undefined reference to `Multi1<voCam*>::operator[](int) const'
./src/main.cpp:30: undefined reference to `Multi1<voBoard*>::operator[](int) const'
./src/main.cpp:29: undefined reference to `Multi1<voBoard*>::operator[](int) const'
./src/main.cpp:41: undefined reference to `Multi1<voCam*>::operator[](int) const'
....

Я проверил включение как 5 раз, и недавно я довольно привык к программированию на C, где я могу держать вещи вроде линкера вендетты у себя на шее.

Примечание: я компилирую с g ++, флаги компоновщика: -lstdc++ -lm

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Вы поместили свои функции шаблона в файл заголовка?

Так что template <class T> void Multi1<T>::set(T val, int32_t pos) { m_data[pos] = val; }

должно быть в вашем файле заголовка multi.h.

0 голосов
/ 12 июля 2011

Где вы определились?

Multi1<voCam*>::operator[](int) const

А, хорошо, у вас это есть, у вас должно быть объявление и определение шаблона в одном заголовочном файле.

...