變數名稱解析規則

2021-06-06 22:17:56 字數 1109 閱讀 5098

使用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 定義浮點數屬性,...