如何以非内联方式定义模板覆盖功能

时间:2011-08-25 07:40:12

标签: c++ class templates override overloading

嗨所以我有一个名为Body的模板类,它将一个sf :: Drawable后代作为模板参数,我试图仅在模板参数为sf的情况下覆盖Render()函数::形状。

我如何以非内联方式执行此操作?当我在类中定义函数时,代码可以正常工作,自动使其内联,但我得到链接错误(多个渲染)检测到的符号)当我在单独的.cpp文件中定义函数时。

如果这有助于产生错误的代码:

// in the header file
template<typename drawable= void>
class Body : public sf::Drawable
{
    void Render(){Do_Something();
}

template <> 
class Body<Shape> : public sf::Drawable
{
    void Render();
}

// in the cpp file
void Body<Shape>::Render()
{
    Do_Something_Else();
}

1 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

template <typename T> 
struct Foo {
    int frob() const;
};

// Note: Member function specializations do not require 
//       full class specializations.

template <typename T> 
int Foo<T>::frob() const { return 42; }

template <> 
int Foo<float>::frob() const { return 0xbeef; }


#include <iostream>
int main () {
    std::cout << Foo<int>().frob() << '\n';
    std::cout << Foo<float>().frob() << '\n';
}

请注意,特殊化需要在您使用它们的位置可见,因此在大多数情况下,您也必须将它们放在标题中。