说我有这个程序
#include <iostream>
using namespace std;
template<typename T>
class A {
public:
void foo() { cout << "Inside foo" << endl; }
void bar() { cout << "Inside bar" << endl; }
};
int main() {
A<int> a;
a.foo();
return 0;
}
g ++和clang ++都只为A<int>::foo()
生成代码,但不为A<int>::bar()
生成代码。当你想在调试时调用这个函数时,这很烦人。 (例如vector<T>::at()
)。
是否有一些标志或其他方法可以在每次实例化模板时强制为所有成员函数生成代码?
答案 0 :(得分:7)
没有编译器标志,但语言的规则控制着这里发生的事情,你可以利用它们。
由于您隐式实例化A<int>
,因此只会实例化您使用的函数:
[C++11: 14.7.1/1]:
[...] 类模板特化的隐式实例化会导致类成员函数的声明的隐式实例化,而不是定义或默认参数的隐式实例化,成员类,作用域成员枚举,静态数据成员和成员模板; [..]
如果显式地实例化A<int>
,那么整个事情就会被实例化。
#include <iostream>
using namespace std;
template<typename T>
class A {
public:
void foo() { cout << "Inside foo" << endl; }
void bar() { cout << "Inside bar" << endl; }
};
template class A<int>; // <----
int main() {
A<int> a;
a.foo();
}
以下是一些证据:http://coliru.stacked-crooked.com/a/582126aac45d6ea4
答案 1 :(得分:3)
明确地实例化它:
template class A<int>;
答案 2 :(得分:3)
除了关于模板实例化的其他内容之外,您可能会发现将某些函数/方法声明为“已使用”非常有用,以防止优化器在它们看起来未使用时将其删除。
http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Function-Attributes.html
参见属性used