1. 程式人生 > >C++類模板中如何正確的訪問同是類模板的父類中的成員?

C++類模板中如何正確的訪問同是類模板的父類中的成員?

1 C++類模板中如何正確的訪問同是類模板的父類中的成員(g++編譯器)?

先看如下程式碼:

#include <iostream>

using namespace std;

template < typename T >
class Base
{
public:
    int m_value;
};

template <typename T>
class Derived : public Base<T>
{
public:
    void print()
    {
        cout << m_value <<
endl; } }; int main() { Derived<int> d; d.print(); return 0; }

編譯結果如下: 在這裡插入圖片描述

為什麼父類中明明有m_value這個成員變數,卻無法訪問呢?(僅以g++為例) 我們需要知道C++編譯器在編譯器類模板時是需要進行兩階段查詢的,對於一個非依賴型名稱(不以任何方式依賴於模板引數的名稱),在模板宣告進行解析的時候就會進行查詢(第一階段查詢)。但C++標準中規定(14.6.2 3),一個非依賴型的名稱查詢的時候將不會考慮依賴型的基類。因為在第一階段查詢的時候,其父類根本就沒有確定下來,因此無法在父類中進行查找了。

對於如上的例子,m_value對於編譯器來說顯然是非依賴型的名稱,然而編譯器在外部並無法找到這個變數,因此必然報錯。

那為了解決這個問題,我們只需要將m_value這個變數程式設計依賴性型的名稱就可以了,讓編譯器在第二階段進行查詢,也即例項化的時候再進行查詢。此時父類已經確定,當然可以從父類中解析到,自然編譯通過。

我們可以通過如下方式,讓m_value程式設計依賴型的名稱: cout << this->m_value << endl; 或者 cout << Base<T>::m_value << endl;