Не удалось связать определения классов шаблонов с основной программой в VisualStudio 2010 - PullRequest
0 голосов
/ 02 декабря 2011

Я написал шаблонный класс, который расширяет список STL для некоторого использования. Я объявляю этот класс в заголовочном файле и определяю его в файле cpp. Однако, когда я попытался протестировать его в другом файле cpp, я обнаружил, что Visual Studio не может связать функции с файлом cpp.

Я знаю, что могу решить эту проблему, просто включив файл cpp, но мне интересно, есть ли другой способ, лучший способ?

Если вам потребуется дополнительная информация о моем коде, я предоставлю заголовочный файл класса шаблона "KA_Buffer.h" и основную программу "main.cpp" ниже.

KA_Buffer.h:

* * 1010

main.cpp:

#include <iostream>
#include <Windows.h>
#include "KA_Buffer.h"

int main()
{
    KA_Buffer<int> buffer(5);
    for (int i = 0; i < 10; i++)
    {
        buffer.add(i);
        for (KA_Buffer<int>::iterator iter = buffer.begin();
            iter != buffer.end(); iter++)
        {
            std::cout<<*iter<<" ";
        }
        std::cout<<std::endl;
    }
    system("pause");
    return 0;
}

Сообщения об ошибках:

1> main.obj: ошибка LNK2019: неразрешенный внешний символ «public: void __thiscall KA_Buffer :: add (int)» (? Add @? $ KA_Buffer @ H @@ QAEXH @ Z), указанный в функции _main

1 Ответ

2 голосов
/ 02 декабря 2011

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

template <class T>
class KA_Buffer :
    public std::list<T>
{
public:
    KA_Buffer(int length) :
      m_MaxLength(length), m_Length(0) {};
    ~KA_Buffer(void) {};

    void add(T) //     <--- add method definition here
    {
    }
    void pop_front() //<--- add method definition here
    {
    }

    iterator find(T) //<--- add method definition here
    {
    }

private:
    int m_Length;
    int m_MaxLength;
};

Они не должны присутствовать в объявлении функции, вы также можете определять методы снаружи, если вы сохраняете их видимыми для модуля перевода, используя шаблон:

template <class T>
class KA_Buffer :
    public std::list<T>
{
public:
    KA_Buffer(int length) :
      m_MaxLength(length), m_Length(0) {};
    ~KA_Buffer(void) {};

    void add(T);
    void pop_front();
    iterator find(T);

private:
    int m_Length;
    int m_MaxLength;
};

// Definitions follow in the header file:

template <class T>
void KA_Buffer::add(T) 
{
}
template <class T>
void KA_Buffer::pop_front() 
{
}
template <class T>
iterator KA_Buffer::find(T) 
{
}
...