我正在使用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 :: pop(void),test :: push(void)和test ::〜test (void) exe中的函数,但看不到构造函数。我知道我可以显式实例化构造函数
template test<int>::test(int);
这导致test :: test (int)与其他函数一起作为反函数出现在反汇编中。我对显式实例化的理解是,应该告诉编译器为给定的一组参数实例化模板类的所有成员,那么为什么构造函数没有与所有其他成员函数一起显式实例化呢?
最佳答案
当构造函数是模板成员函数时,除非明确使用它们,否则不会实例化它们。
如果将其设为非模板成员函数,则会看到该构造函数的代码。
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++ - 类模板的显式实例化不实例化构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30987009/