如何专门化非模板类的模板化成员函数?
假设我有一个文件 alpha.h:
class Alpha {
public:
template<typename T> void foo();
};
template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}
如果我在多个 cpp 文件中包含 alpha.h 并使用 GCC 4.4 进行编译,它会抱怨 foo
和 foo< 有多个定义;float>
跨多个对象文件。对我来说很有意义,所以我将最后两行更改为:
template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}
但是 GCC 说:
显式模板专业化 不能有存储类别
好吧...那么我应该如何正确地做到这一点?我担心 C++ 不允许我首先尝试做的事情,在这种情况下是否有一个好的习惯用法可以完成同样的事情?
suppose I have a file alpha.h:
class Alpha {
public:
template<typename T> void foo();
};
template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}
If I include alpha.h in more than one cpp file and compile with GCC 4.4, it complains there are multiple definitions of foo<int>
and foo<float>
across multiple object files. Makes sense to me, so I change the last two lines to:
template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}
But then GCC says:
explicit template specialization
cannot have a storage class
ok... so how am I supposed to do this correctly? I'm worried that C++ doesn't allow what I'm trying to do in the first place, in which case is there a good idiom that will accomplish the same thing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不需要单独的声明或内联键工作。 PF低于工作代码。
输出是:
No separate declaration or inline keywork is required. PF below working code.
output is :
您可以转发声明以及内联选项:
You can forward declare as well as the inline option:
从 ODR 的角度来看,完全(显式)专用的模板不再是模板,因此它与同类非模板实体遵循相同的 ODR 原则。 (我相信该规则有一些例外,但对于我们的目的来说已经足够了)。
在您的情况下,出于 ODR 目的,完全专用的函数模板是一个普通函数。因此,作为一个普通函数,它应该在头文件中声明并在一个且唯一的一个实现文件中定义。
From the ODR point of view, a fully (explicitly) specialized template is no longer a template, so it is subject to the same ODR principles as a non-template entity of the same kind. (There are some exceptions from that rule, I believe, but it is good enough for our purposes).
In your case, for ODR purposes a fully specialized function template is an ordinary function. So, as an ordinary function it should be declared in the header file and defined in one and only one implementation file.
或者使用 inline 关键字
,在单独的 cpp 文件中提供实现
use inline keyword
alternatively, provide implementation in separate cpp file