在VisualStudio 2010中将模板类定义与主程序链接失败

Failed to link template class definitions with main program on VisualStudio 2010

本文关键字:定义 主程序 链接 失败 2010 VisualStudio      更新时间:2023-10-16

我写了一个扩展STL列表的模板类。我在头文件中声明这个类,并在cpp文件中定义它。然而,当我试图在另一个cpp文件中测试它时,我发现Visual Studio无法将这些函数链接到cpp文件。

我知道我可以通过包含cpp文件来解决这个问题,但我想知道是否有另一种方法,更好的方法?

如果你需要我的代码的进一步信息,我给我的模板类头文件"KA_Buffer.h"和主程序"main.cpp"下面。

KA_Buffer.h:

#pragma once
#include <list>
typedef int KA_Time;
typedef std::list<KA_Time> KA_TimeList;
/**
 * This is a length-limited buffer which would only save limited number of
 * elements.
 */
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;
};

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>主要。外部符号"public: void __thiscall KA_Buffer::add(int)"(?add@?$KA_Buffer@H@@QAEXH@Z)引用函数_main

模板方法定义需要出现在头文件中。

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) 
{
}