当前位置: 首页 > 知识库问答 >
问题:

显式实例化类模板而不是实例化构造函数

陶原
2023-03-14

我正在从事一个C语言的项目,当我显式实例化模板类时,很难理解模板类的哪些成员被显式实例化。我编写了以下文件,然后使用Visual C 2008 Express Edition的发布配置编译该文件,然后将其放入反汇编程序。

template<typename T> class test {
public:
    template<typename T> test(T param) {
        parameter = param;
    };
    ~test() {};
    int pop();
    int push();
    T parameter;
};

template<typename T> int test<T>::push() {return 1;}
template<typename T> int test<T>::pop() {return 2;}

template class test<int>;

int main() {
    return 0;
}

忽略这个文件目前并不真正需要模板,这可以很好地编译。我将exe放入反汇编程序,它告诉我该测试

template test<int>::test(int);

这导致测试

共有1个答案

彭兴朝
2023-03-14

当构造函数是模板成员函数时,除非显式使用,否则不会实例化它们。

如果构造函数成为非模板成员函数,您将看到该函数的代码。

template<typename T> class test {
public:

    /***
    template<typename T> test(T param) {
        parameter = param;
    };
    ***/

    test(T param) : parameter(param) {}
    ~test() {}
    int pop();
    int push();
    T parameter;
};
 类似资料:
  • [dcl.spec.auto]/14国[强调我的]: 显式实例化声明不会导致使用占位符类型声明的实体的实例化,但也不会阻止根据需要对该实体进行实例化以确定其类型。[示例: -结束示例] 和[temp.explicat]/11声明[强调我的]: 现在,考虑我们是否在类模板中的friend声明中定义了friend函数: 如果在同一翻译单元中实例化了的多个专门化,则将违反[basic.def.odr]/

  • 根据我的尝试和错误,答案似乎是否定的,这是一个简单的 将为班上的所有成员工作。然而,我读过的代码建议不是这样,如果能给出具体的答案,我将不胜感激。

  • 例1 如前所述,上面的编译和链接没有问题。然而,在实际应用程序中,我有许多函数模板和许多枚举成员。因此,我试图通过将成员分组到一个新类中来使我的生活变得更轻松,这个类本身依赖于模板参数,并为每个枚举值显式地实例化该类。 例2 编辑:用户2B-T通过https://www.onlinegdb.com/hygr7w0fv_提供了这些示例,供人们进行实验。

  • 问题内容: 在React / React-Native中使用ES6 +语法,当 在构造函数外部 定义变量时,通过调用将其转换为实例变量。我的主张正确吗?如果在构造函数中未实例化,为什么它甚至还能工作?这里是相应的React Native代码片段: 关于ES7属性初始化器的讨论显示了如何在React / React Native中以这种方式显着使用变量。 到目前为止,相关的堆栈溢出讨论我通读不能回答

  • 摘要 这个问题是关于在几个不同的翻译单元中实现单个模板类实例化的单独编译。 文件A2.cpp: 现在我尝试用模板类做类似的事情。因为我确切地知道我将需要哪些实例,所以我显式地实例化模板。我单独编译每个实例化,因为成员函数包含相当大的数学表达式,这可能会在高优化级别上大大降低编译器的速度。所以我尝试了以下方法: 文件ta.h: 这是否意味着即使使用显式实例化也不可能(不允许)单独编译模板类(隐式实例

  • 对于某些参数将成功实例化,而对于其他参数则不会。 不修改或扩展的定义,是否可以编写一个bool变量模板: 这样为真,是否会成功实例化? 这将输出,预期的输出是吗? 什么给?