我有一个实现许多功能的类模板。当声明特定类型时,我还希望能够添加此类的专用版本,该版本只有少数功能覆盖基类的功能。我知道我可以通过一个类模板和它的显式特化来实现这一点。但是我也想:
- 具有唯一命名的显式特化,类似于如何唯一命名基类和派生类。
Base
从实例化Derived
对象调用函数,无论是在Derived
函数内部,还是如下所示显式调用obj1.Foo
这是我试图使工作的(简化)示例代码:
在 myClasses.h
template<typename T>
class Base
{
public:
void Foo (T& input);
virtual void Bar (T& input);
}
template<>
class Derived : public Base<int>
{
public:
void Bar (int& input) override;
}
在 myClasses.cpp
template<typename T>
Base::Foo(T& input) { // Do something generic }
template<typename T>
Base::Bar(T& input) { // Do something generic }
template<>
Derived::Bar(int& input) { // Do something int-dependent }
在 main.cpp
int main()
{
Base<int> obj1 = new Derived();
obj1.Foo(input); // Runs Base::Foo
obj1.Bar(input); // Runs Derived::Bar
}
但是,此代码因explicit specialization of non-template Derived
错误等而失败。我已经阅读了很多 StackOverflow 线程来让我走到这一步,但我还没有找到任何可以帮助我进行编译的东西。所以我的问题是:
- 是否可以通过这种方式将类模板与类继承结合起来?
- 尽管我明确使用该关键字,为什么编译器仍将派生类标记为非模板?
- 使此代码工作的正确语法是什么?(假设我正在尝试做的事情是可能的)
编辑:按照 HTNW 的建议,我可以通过删除前缀Derived
变成普通类。template<>
这将允许一切编译到obj1.Foo(input)
. 实例化的 Derived 类似乎无法找到或访问基 Foo 函数。