如果我在list.h中有模板化的类定义:

template <class T>;
class list {
    list *next;
    T *data;

    list(T *data){
        this->next = NULL;
        this->data = data;
    }
    void concat(T *data){
        this->concat(new list<T>(data));
    }
    void concat(list<T> *sublist){
        if (this->next != NULL){
            this->next->concat(sublist);
        } else {
            this->next = sublist;
        }
    }
}


然后,如果我有main.cpp:

class bar {
    bar(){

    }
}

class baz {
    baz(){

    }
}

void main(){
    new list<bar>(new bar());
    new list<baz>(new baz());
}


然后我跑了:

gcc -c main.cpp



代码如何放入翻译单元中?
main.cpp的翻译单元是否具有list的2个版本?
如果我们将清单包含在另一个翻译单位中,该清单会同时出现在两个翻译单位中吗?

最佳答案

当您对模板进行专业化处理时,代码将被放置在进行专业化处理的翻译单元中。

如果您在不同的翻译单元中反复使用模板,则会发现每个翻译单元都会获得代码的副本。这称为代码膨胀,是模板使用的主要缺点之一。

您可以声明模板专业化,然后将这些模板的代码放在单个翻译单元中,但是如果没有相同的链接程序问题,您将无法创建新的专业化。

对于#2:当类型足够相似时,某些编译器将使用单个定义。例如存储一个指针。您可以创建十二种不同的指针类型,只有将它们作为单独类型处理的代码才需要使用类型专门化来复制。但这高度依赖于编译器。

07-24 09:45