模板专业化可以进入我的 .cpp 吗?
Can Template Specializations go in my .cpp?
假设我有这个:
struct foo {
template <typename T>
void bar(const T param) { cout << param << endl; }
};
现在我要添加专业:
template <>
void bar<char>(const char param) { cout << static_cast<int>(param) << endl; }
我可以只在 header 中声明 foo
并在实现文件 foo
中定义 bar<char>
吗?
我问的原因是我在本地看到它是双向的。我认为不同之处在于:可以在实现中定义我仅在内部用于定义 class 的专用模板方法。我在外部使用的专用模板方法似乎需要在 header 中定义。不过,我还没有找到任何结论,所以我想问一下。
你不能做的一件事是声明 .cpp 文件的专业化。有充分的理由,在
但是,如果您将声明放在头文件中(据我所知,您打算这样做),只要从那里调用它 至少一次,就可以将特化放入 .cpp 文件中=19=] - 然后你可以调用翻译单元之外的专业化。
至少有一项要求的原因是编译器只会在模板被调用且定义可用时实例化模板,但是模板一旦实例化,就可以从任何翻译单元使用它。
假设我有这个:
struct foo {
template <typename T>
void bar(const T param) { cout << param << endl; }
};
现在我要添加专业:
template <>
void bar<char>(const char param) { cout << static_cast<int>(param) << endl; }
我可以只在 header 中声明 foo
并在实现文件 foo
中定义 bar<char>
吗?
我问的原因是我在本地看到它是双向的。我认为不同之处在于:可以在实现中定义我仅在内部用于定义 class 的专用模板方法。我在外部使用的专用模板方法似乎需要在 header 中定义。不过,我还没有找到任何结论,所以我想问一下。
你不能做的一件事是声明 .cpp 文件的专业化。有充分的理由,在
但是,如果您将声明放在头文件中(据我所知,您打算这样做),只要从那里调用它 至少一次,就可以将特化放入 .cpp 文件中=19=] - 然后你可以调用翻译单元之外的专业化。
至少有一项要求的原因是编译器只会在模板被调用且定义可用时实例化模板,但是模板一旦实例化,就可以从任何翻译单元使用它。