C ++部分专门化功能参数

时间:2018-03-20 19:05:54

标签: c++ templates

作为一种学习和理解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中的错误,但是抛出了一个错误,没有找到该方法的定义。

由于我对模板不太熟悉,所以很难正确解释。

1 个答案:

答案 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;
}

这个不模板类型,但会模拟行为和最大元素。