2010-06-28 2 views
0

У меня есть следующая настройка. RectangleT, определенный в файле заголовка в библиотеке. Попытка использовать класс в моем основном приложении. При связывании я получаю ошибку для каждой функции, которую я пытаюсь вызвать - кроме конструктора, и GetLeft/GetTop/GetRight/GetBottom - НО - Я получаю сообщение об ошибке при вызове GetWidth/GetHeight.Почему этот шаблонный класс в библиотеке генерирует ошибки компоновщика при использовании?

Вот код, который у меня есть для простого класса шаблонов.

namespace My2D 
{ 
    template <typename T> 
    class MY2D_API RectangleT 
    { 
    public:  // Construction 
     RectangleT(const T left = 0, const T top = 0, const T right = 0, const T bottom = 0) 
      : m_left(left) 
      , m_top(top) 
      , m_right(right) 
      , m_bottom(bottom) 
     { 
     } 

     RectangleT(const RectangleT<T> &source) 
      : m_left(source.m_left) 
      , m_top(source.m_top) 
      , m_right(source.m_right) 
      , m_bottom(source.m_bottom) 
     { 
     } 

     virtual ~RectangleT(void) 
     { 
     } 

    public:  // Getters/setters 
     T GetLeft() const { return m_left; } 
     T GetTop() const { return m_top; } 
     T GetRight() const { return m_right; } 
     T GetBottom() const { return m_bottom; } 
     T GetWidth() const { return m_right - m_left; } 
     T GetHeight() const { return m_bottom - m_top; } 

     void SetLeft(const T value) { m_left = value; } 
     void SetTop(const T value) { m_top = value; } 
     void SetRight(const T value) { m_right = value; } 
     void SetBottom(const T value) { m_bottom = value; } 

    protected: // Members 
     T m_left; 
     T m_top; 
     T m_right; 
     T m_bottom; 
    }; 
} 

У кого-нибудь есть идеи ?!

+4

Текст ошибки компоновщика бы помочь ... – Cogwheel

+0

Прежде всего, я предполагаю, что MY2D_API для экспорта. Нет необходимости экспортировать шаблон класса, он имеет внутреннюю связь. Я бы рекомендовал удалить это, так как, даже если это не имеет никакого эффекта, это сбивает с толку. В противном случае класс выглядит хорошо для меня. Я подозреваю, что это проблема с использованием клиента: отправьте сообщение об ошибке и код клиента с именем GetWidth/GetHeight. Кроме того, так же, как домашнее животное, вам нужен виртуальный дтор? Используется ли этот класс для наследования? Я бы рекомендовал против унаследовать от RectangleT, чтобы сделать SuperRectangles или что-то еще. – stinky472

+1

Вам необходимо указать код для макроса MY2D_API. Ваш код компилируется (в 2008 году) отлично без него, поэтому проблема, вероятно, связана с этим макросом. И вам нужно дать точное сообщение об ошибке компоновщика. Без сообщения об ошибке, пытающегося помочь вам догадываться о листьях чая. – SigTerm

ответ

2

Я удалил директиву компилятора MY2D_API и попробовал ваш код, он отлично работает, см. Ниже.

Windows 7, MS VS 2010

int main() 
{ 
    My2D::RectangleT <int> rect; 

    rect.SetBottom(3); 
    rect.SetLeft(3); 
    rect.SetRight(8); 
    rect.SetTop(8); 
    return rect.GetHeight(); 
}