代码之家  ›  专栏  ›  技术社区  ›  TCD

标准库非类型模板类是否显式实例化?

  •  -1
  • TCD  · 技术社区  · 2 年前

    当我们有一个具有非类型模板参数的模板类(或函数)时,编译器如何生成版本?当然,它不会为每个可能的价值创造一个版本 N

    std::array<T,N> ?

    我试图用size\t模板参数编写自己的模板函数,并试图弄清楚是否/如何显式实例化我将使用的版本

    (我已将程序分为不同的翻译单元)

    template <size_t N>
    std::bitset<N> f(std::bitset<N> A){}
    

    我将声明放入头文件,并将定义放入.cpp文件。它没有生成正确的版本。所以我试着显式地实例化它,就像

    template std::bitset<10> f<10>(std::bitset<10> A);
    

    但我得到的错误是“错误:显式实例化……但没有可用的定义”

    1 回复  |  直到 2 年前
        1
  •  2
  •   user17732522    2 年前

    如果用户使用的模板的任何专门化需要专门化的定义才能存在,则如果实例化的实体的定义可用,则会导致该模板自动隐式实例化。通常应始终满足该条件,因为标准做法是将模板实体的定义与其初始声明一起放入头文件,以便在使用它们的所有翻译单元中都可以访问它们。

    所以 std::array<T,N> T 和价值观 N

    除此之外,通过避免在使用模板的每个翻译单元中隐式实例化模板专门化,可以将显式实例化用作编译时间的优化。这只适用于你知道经常使用的专业。例如,一些标准库实现将其应用于 std::string ,这是专业化 std::basic_string<char> .将其应用于例如。 std::array

    推荐文章