C++模板实例化

文章目录

    • 模板实例化
    • C ++有隐式模板实例化和显式实例
      • 1. 上面这种方法叫做隐式实例化
      • 2.显示实例化
    • 代码下载链接

模板实例化

  • 作为C++模板类入门修行者,常常会碰到许多问题。其中一项让我们匪夷所思的就是,日常我们习惯将类的定义和声明拆开来写,分别放置在".h"和".cpp"文件中。
  • 这样做的好处包括但不限于让代码更加清晰,还能够避免重定义的问题,当然如果有双向依赖关系的头文件,或许还要用到诸如前向声明语句。
  • 按照这个思路,将模板分为".h"文件和".cpp"文件,我出现了链接器错误问题LNK2019,寻找博客等,对此的通常答案是将所有模板内容放入".h"文件中,因为必须以这种方式完成。这固然是一种思路,因为编译器能够直接从.h中直接进行模板实例化,而不必去由cpp生成的obj文件中寻找相关定义,再搜寻是否有相应的实例,避免了连接器错误。

C ++有隐式模板实例化和显式实例

1. 上面这种方法叫做隐式实例化

话不多说,我们上代码:

template.h

template <typename T>
class myTemplate
{
  private:
  T data;
 
  public:
  myTemplate();
  myTemplate(T t);
  T getData() const;
  void displayData() const;
  
  static int someValue; 
};
  
template<typename T>
myTemplate<T>::myTemplate()
:data()
{
}

template<typename T>
myTemplate<T>::myTemplate(T t) 
:data(t)
{
}

template <typename T>
T myTemplate<T>::getData() const
{
    return data;
}

template <typename T>
void myTemplate<T>::displayData() const
{
    std::cout << data <<std::endl;
}


template<typename T>
int myTemplate<T>::someValue = 100;

main.cpp

int main()
{
    myTemplate<int> myTi(5);  
    myTi.displayData();
    
    myTemplate<float> myTf(3.5f);
    myTf.displayData();
      
    return 0;
}
  • 在上面的示例中,完整的模板定义位于main.cpp所包含的头文件中,因此在编译和链接期间没有问题。如果我们忘记对displayData()函数进行定义,那么我们将出现LINK错误,而不是COMPILER错误。

2.显示实例化

  • 如果想在头文件和源文件之间拆分我们的模板类。即存在template.h和template.cpp。
  • 如果我们编译了这两个文件,但是会收到Linker错误,因为没有实例化template.cpp 文件中的实际代码。
  • 为了使编译器实例化所需的代码,我们可以使用显式实例化。下面上代码:

template.h

template <typename T>
class myTemplate
{
  private:
  T data;
 
  
  public:
  myTemplate();
  myTemplate(T t);
  T getData() const;
  void displayData() const;
  
  static int someValue;
  
};

template.cpp

// 定义复制粘贴,加入下面两行
template class myTemplate<int>; 
template class myTemplate<float>;
  • 重要的部分是template.cpp中的最后两行。我们知道我们将需要myTemplate 和myTemplate ,因此我们明确要求编译器为这两种类类型的所有可实例化部分生成代码。
  • 这样一来,我们可以成功编译并链接我们的代码了。
  • 此外,我们还可以显式实例化模板函数或单个模板类成员函数。

代码下载链接

https://download.csdn.net/download/qq_43055030/12465015

你可能感兴趣的:(c++)