簡體   English   中英

C ++函數的部分專業化參數

[英]C++ Partially specializing parameter in fuction

作為學習和理解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);

它說回文需要LFO<std::string, 1, 5>作為FIFO而不是LFO<std::string, 0, 5> LIFO LFO<std::string, 0, 5>是我希望傳遞給該方法的LIFO

當我嘗試在我的LIFO上調用Palindrome(LFO&)方法時,恰恰相反。 某種程度上,“ LFO&”會根據我從哪個專業類中調用而被指定。

我對如何解決這個問題非常執着。 我嘗試將模板添加到基類的方法中,該模板可修復IDE中的錯誤,但會引發錯誤,即找不到該方法的定義。

很難正確解釋,因為我對模板不是很熟悉。

在模板專業化(無論是否為專業)中,模板的名稱都是該模板特定實例的簡稱。

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

這不是模板的類型,而是模板的行為和最大元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM