使用gcc編譯模板類時,容易遇到編譯錯誤。形如:找不到變數等。為此問題,在網上搜尋了一番。
模板類的變數解析分為兩個步驟:
1. 模板類解析過程
這個過程中,需要解析與泛型引數無關的變數名、函式名。如下**,
typedef void (*cb)();
template class testclass
virtual void invoke()
};template class derivedclass : public testclass;
virtual void invoke()
if (m_functionptr != 0)
std::cout << m_i;
}};
方法derivedclass::invoke直接使用了m_i, m_functionptr。在解析模板類derivedclass過程中,這些變數名會被作為與泛型引數無關的變數名稱。這個過程中,並沒有testclass類,也沒有derivedclass類,這兩個類只是模板。因此,只能在全域性作用域查詢這些變數名稱的宣告。結果是找不到,也就出現了編譯錯誤。
2. 模板類例項化過程
在這個過程中,會解析與泛型引數有關的變數名、函式名。如下**,
template class testclass
virtual void invoke()
};template class derivedclass : public testclass;
virtual void invoke()
//if (m_functionptr != 0)
//std::cout << this->m_i;
}};
m_functionptr與模板例項化類testclass有關,也就與泛型引數fieldtype有關。m_i與this有關,也就與模板例項化類derivedclass有關,也就與fieldtype有關。因此,這兩個名稱的解析就會被延遲到模板例項化過程中。在例項化過程中,父類testclass已經被建立了。因此,可以在父類中找到這兩個變數名,也就不會出現編譯錯誤了。
參考:
變數名命名規則
變數命名規則 識別符號 age 18 由字母 數字 命名 不能以資料開頭 嚴格區分大小寫 不能python的關鍵字 檢視python有哪些關鍵字?import keyword print keyword.kwlist false none true and as assert async await...
以string型別獲取變數名稱
描述問題 條件 int i string str string.empty 目的 str i 一般的變數名稱還沒有找到合適的方法,只能獲取對於class中成員變數的名稱。類 test中有成員變數a b class test 獲取類test的fields陣列 system.reflection.fie...
Shder學習筆記 相關變數名稱
shader型別區分 shader基本框架 shader shader名稱 子著色器1 subshader 備胎 備胎設為unity自帶的普通漫反射 fallback diffuse properties name display name range min,max number 定義浮點數屬性,...