簡體   English   中英

為什么我不能使用模板類的父類變量?

[英]Why can't I use variable of parent class that is template class?

template <typename T>
class A
{
    public:
    int a;
}

BH

template <typename T>
class B : public A<T>
{
   public:
   int f();
}

template <typename T>
int B<T>::f()
{
    int t;
    t = this->a; //Okay
    t = a //Error
    return 0;
}

為什么我不使用this->時會發生錯誤 - this->

我可以使用某種方法省略this->嗎?

(我修正了一些錯誤)

模板實例化有兩個階段(“兩階段名稱查找”)。

在第一階段,解析所有非依賴名稱(查找)。 在第二階段,依賴名稱被解析。

從屬名稱是依賴於模板參數的名稱,例如:

template <typename T>
void foo() {
    x = 0;    // <- Non-dependent, nothing in that refers to "T".
              //    Thus looked up in phase 1, therefore, an 'x' must be
              //    visible.

    T::x = 0; // <- Dependent, because it depends on "T".
              //    Looked up in phase 2, which is when it must be visible.
}

現在,你寫道:

t = this->a; //Okay
t = a //Error

這正是我所描述的。 在好的術語中,在階段2中查找t ,因為this取決於模板參數。

在階段1中查找錯誤的術語,因為該名稱中的任何內容都不依賴於模板參數。 但是在階段1中,沒有a是可見的,因為編譯器無法在階段1中內省基類模板,因為模板可以是專用的,並且在實例化時,可以遠離主模板聲明,另一個沒有a專業化,可能是可見的。

例:

    template <typename T>
    struct Base {
    };


    template <typename T>
    struct Derived : Base<T> {
        void foo() {
            this->a = 0; // As is valid. `this->a` is looked up in phase 2.
        }
    };


    template <> struct Base<int> {
        int a;            
    };


    int main () 
    {
            // The following declarations trigger phase 2 lookup.

            Derived<int>   di;  // valid, because a later specialized
                                // Base<int> is used and all symbols
                                // are resolved.

            Derived<float> df;  // not valid
    }

順便說一下,我曾經寫過這個 - >不僅僅是我的低頻博客中的風格問題

B是一個模板,因此它的名稱是非依賴的,因此必須在定義模板時查找,而不是在實例化時。 但是,在定義模板時,依賴名稱是未知的(可能存在到目前為止尚未看到的基類模板A ),編譯器無法將非限定名稱解析為基類。 您可以通過this-> qualified將名稱帶入當前作用域,方法是在其前面添加A<T>::或使用using聲明:

template <typename T>
class B : public A<T>
{
   public:
   using A<T>::a;
   int f();
};

另請注意,在類聲明之后缺少分號以及標有// Error注釋的行。

暫無
暫無

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

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