【问题标题】:C++ template explicit instantiationC++ 模板显式实例化
【发布时间】:2015-10-22 08:38:00
【问题描述】:

我有这样的工作代码。

#include <iostream>

struct A{
   template<typename T>
   void foo(T val);
};

template<typename T> void A::foo(T val)
{
  std::cout << val << std::endl;
}

// link template "against" int
template void  A::foo(int val);

// #include header here

int main(){
    A a;
    a.foo(12);
}

模板位于单独的 CPP 文件中,但由于显式实例化,链接有效:

template void  A::foo(int val);

然后我做了一些重构,代码看起来像这样:

#include <iostream>

template<typename G>
struct A{
   template<typename T>
   void foo(T val);
};

template<typename G>
template<typename T> void A<G>::foo(T val)
{
  std::cout << val << std::endl;
}

// link template "against" int - not working
//template<typename G>
//template void A<G>::foo(int val);

int main(){
    A<float> a;
    a.foo(12);
}

如何“链接”T=int,但让 G 保持“未知”?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    称为显式实例化。

    你不能这样做,因为G 是未知的并且它不是单一类型。它是一组类型。

    【讨论】:

    【解决方案2】:

    你不能这样做。要真正从模板生成代码(我猜这就是你所说的link),编译器需要知道所有模板参数。

    因此,您只剩下模板实例化的标准选项:要么明确告诉编译器将使用什么 TG,要么让编译器在您使用模板成员的任何地方看到完整代码(即, 将代码包含在标题中)。

    【讨论】:

      【解决方案3】:

      TL;DR 你不能

      在你的情况下,我只是指定你打算使用的类型

      template void A<float>::foo(int val);
      

      或(相当庞大)显式实例化所有类型G 可用于。

      如果无法推断出G,则无法显式实例化模板。

      请注意,链接起作用不是因为此语法是链接器命令,而是因为您的编译器正在生成稍后在链接时发现的代码。查看更多here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-07
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多