我有一個基類,模板函數具有一般的模板類型,以及專門的版本。你如何重載兒童班的模板化功能(專業)?
#ifndef BASE_CLASS
#define BASE_CLASS
#include <iostream>
using namespace std;
struct Type1
{
};
struct Type2
{
};
class baseClass
{
public:
template<class Type>
void doStuff(Type & t)
{
templateFunction(t);
}
template<class Type>
void templateFunction(Type & t);
};
template<class Type>
void baseClass::templateFunction(Type & t)
{
cout << "This is the generic function!" << endl;
}
template<>
void baseClass::templateFunction(Type1 & t)
{
cout << "This is the specialized function: - Type1" << endl;
}
#endif
我也有一個子類,它繼承自「baseClass」。但是,子類需要該專業化的不同功能。
#ifndef CHILD_CLASS
#define CHILD_CLASS
#include "BaseClass.h"
class ChildClass : public baseClass
{
public:
};
template<>
void ChildClass::templateFunction(Type1 & t)
{
cout << "We overloaded the specialized template function for type 1!" << endl;
}
#endif
以上不編譯:
ChildClass.h:13:錯誤:沒有成員函數âtemplateFunctionâ宣佈âChildClassâ ChildClass.h:13:錯誤:無效的函數聲明
如果我改變 「重載」 功能:
template<>
void baseClass::templateFunction(Type1 & t)
{
cout << "We overloaded the specialized template function for type 1!" << endl;
}
我得到: ChildClass.h:13:錯誤:避免巴的重新定義seClass :: templateFunction(類型&)與類型=類型1]答 BaseClass.h:36:錯誤:避免基類:: templateFunction(類型&)與類型=類型1]以前在這裏宣佈
怎麼辦我在子類中正確地重載了專門的模板函數?
作爲參考,主:
#include "BaseClass.h"
#include "ChildClass.h"
int main()
{
Type1 first;
Type2 second;
baseClass theBaseClass;
ChildClass theChildClass;
theBaseClass.doStuff(first);
theBaseClass.doStuff(second);
theChildClass.doStuff(first);
theChildClass.doStuff(second);
return 0;
}
論的建議:Kerrek SB,我已經改變了ChildClass到:
#ifndef CHILD_CLASS
#define CHILD_CLASS
#include "BaseClass.h"
class ChildClass : public baseClass
{
public:
template<class Type>
void templateFunction(Type & t);
};
template<>
void ChildClass::templateFunction(Type1 & t)
{
cout << "We overloaded the specialized template function for type 1!" << endl;
}
#endif
輸出:
This is the specialized function: - Type1
This is the generic function!
This is the specialized function: - Type1
This is the generic function!
我希望:
This is the specialized function: - Type1
This is the generic function!
We overloaded the specialized template function for type 1!
This is the generic function!
所以這仍然不起作用。
模板化的功能不能是虛擬的,你確定你的意思是重新定義的成員函數在派生類中,而*隱藏*原始功能?你不能通過指向基地的重定義函數!如果您確定,那麼您還應該將非專用聲明添加到派生類中。 –
我不需要訪問baseClass的原始專用功能,沒有。至少對於任何給定的ChildClass實例。 – Alex
那麼,在這種情況下,我相信你應該能夠做到這一點,如果你將該函數的主模板聲明添加到派生類,然後再進行專門化。 –