C++ 检查类模板是否已实例化?

C++ 检查类模板是否已实例化?,c++,templates,c++11,instantiation,C++,Templates,C++11,Instantiation,有没有一种简单的方法可以查看类是否已在翻译单元中实例化?一个C++语言的练习要求每个标记的语句,一个实例化是否发生: template <typename T> class Stack { }; void f1(Stack<char>); // (a) class Exercise { Stack<double> &rsd; // (b) Stack<int> si; // (c) }; int main() { S

有没有一种简单的方法可以查看类是否已在翻译单元中实例化?一个C++语言的练习要求每个标记的语句,一个实例化是否发生:

template <typename T> class Stack { };
void f1(Stack<char>); // (a)
class Exercise {
    Stack<double> &rsd; // (b)
    Stack<int> si; // (c)
};
int main() {
    Stack<char> *sc; // (d)
    f1(*sc); // (e)
    int iObj = sizeof(Stack< string >); // (f)
}

因此,每个不完整的类型错误都对应于实例化发生的位置?

您可以在可执行文件上使用nm工具。这将显示包含函数定义的文件。gcc还提供了一个标记,用于在执行链接时去掉未使用的函数

使用“-fdata sections”编译以将数据保留在单独的数据节中,使用“-ffunction sections”编译以将函数保留在单独的节中,因此,如果未使用,可以丢弃它们(数据和函数)。
使用“–gc sections”链接以删除未使用的节。

仅删除
堆栈的定义对于任意情况来说都是不够的,因为有些规则既可以使用完整的类类型,也可以使用不完整的类类型。如果他们有一个完整的类类型,他们只是碰巧收集了更多的信息。例如,ADL和运算符函数查找。在诸如
sizeof
之类的情况下,这应该足够了。
template struct总是\u false:std::false\u type{},然后是
静态断言(总是\u false::value,“如果触发,'堆栈'被实例化”)
堆栈
的定义中。@T.C.这与“检查”有什么关系?这是一个严重的错误?(没有读问题,只是标题)@Columbo,因为OP的实际问题是“找出此语句是否会导致隐式实例化”@t.C.但在一条诊断消息/格式错误后,标准不再提出任何要求。所以他不能在一个程序中检查超过一次,这样:p
template <typename T> class A{ };
extern template class A<int>;
int main(){
    A<int> a; 
}
template <typename T> class Stack;