强制编译器为模板类的所有成员函数生成代码?

Ben*_*nno 4 c++ instantiation

说我有这个程序

#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;
}
Run Code Online (Sandbox Code Playgroud)

g ++和clang ++都只生成代码A<int>::foo(),但不是为A<int>::bar().当你想在调试时调用这个函数时,这很烦人.(例如vector<T>::at()).

是否有一些标志或其他方法可以在每次实例化模板时强制为所有成员函数生成代码?

Lig*_*ica 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();
}
Run Code Online (Sandbox Code Playgroud)

以下是一些证据:http://coliru.stacked-crooked.com/a/582126aac45d6ea4

  • 如果你能找到一些违反标准的工具链标志,那就去做吧。我没兴趣。:) (2认同)