派生类中的函数模板特化

时间:2009-12-18 13:21:40

标签: c++ inheritance templates

我有一个带功能模板的基类。

我从基类派生并尝试在派生类

中对函数模板进行专门化

我做了类似的事。

class Base 
{
..
template <typename T>
fun (T arg) { ... }

};

class Derived : public Base
{
...
} ;

template <>
Derived::fun(int arg);

并在.cpp文件中我提供了模板特化的实现。

这适用于MSVC 8.0和g ++ - 4.4.2抱怨Derived类缺乏函数声明乐趣。

我不知道哪个编译器的行为正确。非常感谢任何帮助。

提前致谢, 苏里亚

4 个答案:

答案 0 :(得分:6)

您需要在Derived中声明该函数,以便能够重载它:

class Derived : public Base
{
    template <typename T>
    void fun (T arg) 
    {
        Base::fun<T>(arg);
    }

} ;

template <>
void Derived::fun<int>(int arg)
{
    // ...
}

请注意,您可能需要内联专门化或将其移动到实现文件,在这种情况下,您必须将头文件中的特化原型设置为:

template <>
void Derived::fun<int>(int arg);

否则编译器将使用通用版“fun”在调用代码时生成代码,而不是链接到特殊化。

答案 1 :(得分:1)

为什么不能这样做

template <>
Base::fun(int arg);

g++的错误消息对我来说很合适。 funBase而不在Derived中声明。

答案 2 :(得分:0)

g ++行为正确,因为乐趣在Base中定义。

答案 3 :(得分:-1)

另外,替代选项是Derived ...中的普通非模板函数。


class Derived : public Base
{
public:
  void fun(int) { /* ... */ }
};