从实例化的函数模板调用时不需要显式实例化的函数模板

Function template not requiring an explicit instantiation when called from instantiated function template

提问人:Hakim 提问时间:1/25/2023 最后编辑:Ted LyngmoHakim 更新时间:1/25/2023 访问量:36

问:

我有一个函数模板调用另一个函数模板。第一个是显式实例化的,而第二个不是。

我意识到通过实例化模板,可以创建具有给定类型的函数。但这是否意味着任何调用的函数模板(来自前一个函数)也被实例化?

请参阅下面的代码以理解我的意思:

主 .cpp:


    #include "library.hpp"
    
    int main() {
      std::vector<int> vec = { 1, 2, 3, 4, 5 };
      Library::print_vector(vec);
    
      return 0;
    }

库.hpp:


    #ifndef LIBRARY_HPP
    #define LIBRARY_HPP
    
    #include <vector>
    
    namespace Library {
      template <typename T>
      void print_vector(const std::vector<T>& vec);
    
      template <typename T>
      void print(T x);
    }

库 .cpp:

#include <iostream>

#include "library.hpp"

template <typename T>
void Library::print_vector(const std::vector<T>& vec) {
  for (T x : vec)
    print(x);
}

template <typename T>
void Library::print(T x) {
  std::cout << "x: " << x << '\n';
}

// explicit template instantiation
// no template instantiation for Library::print(), and yet no linking error!!!
template void Library::print_vector(const std::vector<int>&);
C++ 显式实例 模板实例化

评论

1赞 Patrick Roberts 1/25/2023
为了编译,它还必须编译void Library::print_vector(const std::vector<int>&);void Library::print(int);
2赞 Ted Lyngmo 1/25/2023
“这是否意味着任何被调用的函数模板(来自前一个函数)也被实例化?”- 我会说是的。
1赞 Hakim 1/25/2023
@lakeweb,最后一行应避免链接错误。undefined reference
1赞 Ted Lyngmo 1/25/2023
@lakeweb 实现位于文件中,因此如果没有显式实例化,如果 或 与任何 .至少在显式实例化的情况下,允许 ..cppprintprint_vectorTTint
1赞 lakeweb 1/25/2023
嗨@Ted林莫。在这里,我以为我真的明白了。没有定义的实例化...。始终是:)我会做更多的阅读.....谢谢。

答: 暂无答案