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

时间:2015-06-22 18:15:48

标签: c++ templates constructor explicit-instantiation

我正在使用C ++编写一个项目,并且在我明确实例化模板类时,很难理解模板类的成员是如何显式实例化的。我编写了以下文件,然后使用Visual C ++ 2008 Express Edition的Release配置进行编译,然后弹出一个反汇编程序。

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抛入反汇编程序,它告诉我test&lt; int&gt; :: pop(void),test&lt; int&gt; :: push(void)和test&lt; int&gt; :: ~test&lt; int&gt;(void)是exe中的函数,但我没有看到构造函数。我知道我可以使用

显式实例化构造函数
template test<int>::test(int);

导致test&lt; int&gt; :: test&lt; int&gt;(int)作为函数与其他函数一起出现在反汇编中。我对显式实例化的理解是它应该告诉编译器为给定的一组参数实例化模板类的所有成员,那么为什么构造函数没有与所有其他成员函数一起显式实例化呢?

1 个答案:

答案 0 :(得分:2)

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

如果你把它作为非模板成员函数,你会看到构造函数的代码。

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;
};