class 模板的显式实例化未实例化构造函数
Explicit instantiation of class template not instantiating constructor
我正在用 C++ 开发一个项目,当我显式实例化模板 class 时,我无法理解模板 class 的哪些成员被显式实例化。我编写了以下文件,然后使用 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::pop(void)、test::push(void) 和 test::~test(void) 是exe 中的函数,但我没有看到构造函数。我知道我可以使用
显式实例化构造函数
template test<int>::test(int);
这会导致 test::test(int) 在反汇编中与其他函数一起出现。我对显式实例化的理解是,它应该告诉编译器为给定的一组参数实例化模板 class 的所有成员,那么为什么构造函数没有与所有其他成员一起显式实例化功能?
当构造函数是模板成员函数时,除非显式使用,否则不会实例化它们。
如果将其设为非模板成员函数,您将看到构造函数的代码。
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;
};
我正在用 C++ 开发一个项目,当我显式实例化模板 class 时,我无法理解模板 class 的哪些成员被显式实例化。我编写了以下文件,然后使用 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
template test<int>::test(int);
这会导致 test
当构造函数是模板成员函数时,除非显式使用,否则不会实例化它们。
如果将其设为非模板成员函数,您将看到构造函数的代码。
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;
};