作为一种学习和理解C ++模板的方法,我们必须用模板解决一个相当简单的问题。目前我的程序结构如下(减去不相关的方法):
“LFO.h”
enum Behaviors {LIFO, FIFO};
template<typename DataType, Behaviors Behavior, int MaxElems = 10>
class LFO {
public:
bool Palindrome(LFO& p);
}
“StringFIFO.h”
template<int MaxElems = 10>
class LFO<std::string, FIFO, MaxElems> {
public:
bool Palindrome(LFO& p) {
std::cout << "FIFO Palindrome." << std::endl;
return true;
}
}
“StringLIFO.h”
template<int MaxElems = 10>
class LFO<std::string, LIFO, MaxElems> {
public:
bool Palindrome(LFO& p) {
std::cout << "LIFO Palindrome." << std::endl;
return true;
}
}
问题是..当我尝试访问Palindrome(LFO&)
功能时:
auto myStringFIFO = new LFO<string, FIFO, 5>();
auto myStringLIFO = new LFO<string, LIFO, 5>();
myStringFIFO->Palindrome(*myStringLIFO);
它说Palindrome需要LFO<std::string, 1, 5>
FIFO
而不是LFO<std::string, 0, 5>
,这是我希望传递给方法的LIFO
。
当我尝试在我的Palindrome(LFO&)
上调用LIFO
方法时,恰恰相反。不知何故“LFO&amp;”根据我称之为的专业类来指定。
我完全不知道如何解决这个问题。我已经尝试在基类中的方法中添加一个模板,它修复了我的IDE中的错误,但是抛出了一个错误,没有找到该方法的定义。
由于我对模板不太熟悉,所以很难正确解释。
答案 0 :(得分:2)
在模板专业化(主要或非主要)中,模板的名称是此模板的特定实例的简写。
bool Palindrome(LFO& p) {
std::cout << "LIFO Palindrome." << std::endl;
return true;
}
所以LFO
是这个特定的LFO
专业化。
template<class T, SubB, int SubE>
bool Palindrome(LFO<T,SubB, SubE>& p) {
std::cout << "LIFO Palindrome." << std::endl;
return true;
}
这是一个采用模板化类型,行为和最大尺寸的函数。
template<SubB, int SubE>
bool Palindrome(LFO<std::string,SubB, SubE>& p) {
std::cout << "LIFO Palindrome." << std::endl;
return true;
}
这个不模板类型,但会模拟行为和最大元素。