【发布时间】:2011-04-06 09:47:06
【问题描述】:
我有一个包含多个模板成员函数的类,我想将它们分布在多个源文件中以加快编译时间。 (模板是实现细节,不打算在类外使用,因此它们在源而不是标题中的定义。)
我将如何拆分这些模板,以免出现链接器错误?如果我有使用源文件 B 中定义的模板的源文件 A,我如何确保编译器构造了适当的模板实例?
【问题讨论】:
标签: c++ templates distribution construction
我有一个包含多个模板成员函数的类,我想将它们分布在多个源文件中以加快编译时间。 (模板是实现细节,不打算在类外使用,因此它们在源而不是标题中的定义。)
我将如何拆分这些模板,以免出现链接器错误?如果我有使用源文件 B 中定义的模板的源文件 A,我如何确保编译器构造了适当的模板实例?
【问题讨论】:
标签: c++ templates distribution construction
【讨论】:
export 几乎没有编译器实现,并且在 C++0x 中被弃用。它不应该用于新代码。
export 在 C++0x 中没有被弃用——它被完全删除了。由于只有一个编译器前端 (EDG) 实现了它,并且 EDG 人员要求将其删除,因此似乎没有太多理由推迟删除它。
只是不要在头文件中将这些模板项声明为类的一部分。然后,仅在源文件中定义您的模板。例如:
MyClass.hpp
class MyClass
{
public:
void SomePublicMethod() const;
};
MyClass.cpp
template<class T>
void SomethingWithT(T myVal)
{
// ...
}
void MyClass::SomePublicMethod() const
{
SomethingWithT(42);
}
【讨论】:
this 指针。在我看来,手动模板实例化是一种更简洁的方法。
SomethingWithT 和源文件 B 中的 SomePublicMethod 怎么办? (SomethingWithT 需要 long 时间来编译...)
export 关键字,这是 A. 仅由 EDG 实现,B. 被删除。
export,这在我之前的评论中遇到了问题。模板在使用它们的地方被实例化。