首先,我知道必须在头文件中实现定义,这就是我根据this thread
通常所做的事情。我有几个文件
// Image.h
namespace library
{
namespace data
{
template<class Pixel, class SubPixel, int Layer>
class Image
{
public:
Image(int width, int height, Pixel emptyFill);
Image(int width, int height);
~Image();
Pixel& operator() (int x, int y);
const Pixel& operator() (int x, int y) const;
SubPixel& operator() (int x, int y, int subpixel);
const SubPixel& operator() (int x, int y, int subpixel) const;
protected:
int m_width;
int m_height;
Pixel* m_pixels;
void init(Pixel emptyFill);
bool checkBounds(int x, int y, int layer = 0) const;
virtual SubPixel& pixelToSubpixel(Pixel& pixel, int layer) const = 0;
};
template<class Pixel, class SubPixel, int Layer>
Image<Pixel, SubPixel, Layer>::Image(int width, int height)
: m_width(width), m_height(height), m_pixels(new Pixel(width * height))
{
init(0);
}
template<class Pixel, class SubPixel, int Layer>
Image<Pixel, SubPixel, Layer>::~Image()
{
delete m_pixels;
}
template<class Pixel, class SubPixel, int Layer>
Pixel& Image<Pixel, SubPixel, Layer>::operator() (int x, int y)
{
// implementation ...
}
template<class Pixel, class SubPixel, int Layer>
const Pixel& Image<Pixel, SubPixel, Layer>::operator() (int x, int y) const
{
// implementation ...
}
template<class Pixel, class SubPixel, int Layer>
SubPixel& Image<Pixel, SubPixel, Layer>::operator() (int x, int y, int subpixel)
{
// implementation ...
}
template<class Pixel, class SubPixel, int Layer>
const SubPixel& Image<Pixel, SubPixel, Layer>::operator() (int x, int y, int subpixel) const
{
// implementation ...
}
template<class Pixel, class SubPixel, int Layer>
void Image<Pixel, SubPixel, Layer>::init(Pixel emptyFill)
{
// implementation ...
}
template<class Pixel, class SubPixel, int Layer>
inline bool Image<Pixel, SubPixel, Layer>::checkBounds(int x, int y, int subpixel) const
{
// implementation
}
}
}
// DepthImage.h:
namespace library
{
namespace data
{
template class Image<unsigned short, unsigned short, 1>;
class DepthImage : public Image<unsigned short, unsigned short, 1>
{
public:
DepthImage(int width, int heigth);
DepthImage(int width, int heigth, unsigned short emptyfill);
~DepthImage();
protected:
virtual unsigned short& pixelToSubpixel(unsigned short& pixel, int layer) const;
private:
DepthImage();
};
}
}
整个事情被编译为共享对象库。这很好。
当我尝试将可执行对象链接到此.so
文件时,我收到:
library.so: undefined reference to `library::data::Image<unsigned short, unsigned short, 1>::Image(int, int, unsigned short)'
collect2: ld returned 1 exit status
我甚至想过在DepthImage.h
做一个明确的模板实例化。由于DepthImage
不是 一个模板化的类(它只是扩展一个),我不明白这个问题。
任何想法??
此致,托比亚斯
答案 0 :(得分:7)
您尚未提供Image(int width, int height, Pixel emptyFill);
的定义,仅适用于Image(int width, int height);
答案 1 :(得分:4)
错误消息中没有给出构造函数的定义。
Image(int, int, unsigned short)