如何提供一个C ++模板类一个明确的专业化只有一个方法?
-
18-09-2019 - |
题
我有一个模板类,它看起来是这样的:
template<class T> class C
{
void A();
void B();
// Other stuff
};
template<class T> void C<T>::A() { /* something */ }
template<class T> void C<T>::B() { /* something */ }
我要的是只A
提供一个明确的分工,同时保留对B
默认和“其他东西”。
什么到目前为止,我已经试过是
class D { };
template<> void C<D>::A() { /*...*/ } // Gives a link error: multiple definition
我已经尝试每隔变异失败,解析错误。
我做了什么:
在原来的问题是明确的专业化是一个头文件,所以它被情人抛弃到多个目标文件和搞乱链接(为什么不通知链接符号的所有实例是相同的一个闭嘴吗?)
将溶液最终被到显式特从标题文件移动到代码文件。然而,为了使头文件不是实例默认版本的其他用户,我需要放置一个原型早在头。然后让GCC实际产生明确的分工,我需要在代码中放置文件的正确类型的虚拟变量。
解决方案
另外马丁纽约的在线解决方案,你也可以做你的头文件:
class D { };
template<> void C<D>::A(); // Don't implement here!
和提供一个cpp文件与实现:
template<> void C<D>::A() { /* do code here */ }
所以你避免多个定义通过提供一个单一个。 这也是很好的隐藏特定类型的实现从模板头文件远发布库时。
其他提示
尝试
template<> inline void c<int>::A() { ... }
// ^^^^^^
如你已经在头文件中定义它。 即认为它会建立它的一个明确的版本每一个源文件。这是导致你的链接错误。所以仅仅指刚声明它为内联。
不隶属于 StackOverflow