[英]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.