我有一个模板类,它看起来是这样的:

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() { ... }
//         ^^^^^^

如你已经在头文件中定义它。 即认为它会建立它的一个明确的版本每一个源文件。这是导致你的链接错误。所以仅仅指刚声明它为内联。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top