我有一个带功能模板的基类。
我从基类派生并尝试在派生类
中对函数模板进行专门化我做了类似的事。
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类缺乏函数声明乐趣。
我不知道哪个编译器的行为正确。非常感谢任何帮助。
提前致谢, 苏里亚
答案 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++
的错误消息对我来说很合适。 fun
在Base
而不在Derived
中声明。
答案 2 :(得分:0)
g ++行为正确,因为乐趣在Base中定义。
答案 3 :(得分:-1)
另外,替代选项是Derived ...中的普通非模板函数。
class Derived : public Base
{
public:
void fun(int) { /* ... */ }
};