簡體   English   中英

模板繼承和基成員變量

[英]Template inheritance and a base member variable

嘗試使用模板繼承時出現奇怪的錯誤。 這是我的代碼:

template <class T> class A {
public:
    int a {2};
    A(){};
};

template <class T> class B : public A<T> {
    public:
    B(): A<T>() {};
    void test(){    std::cout << "testing... " << a << std::endl;   };
};

這是錯誤:

error: use of undeclared identifier 'a'; did you mean 'std::uniform_int_distribution<long>::a'?
    void test(){    std::cout << "testing... " << a << std::endl;   }

如果它可能會影響我使用這些標志的東西:

-Wall -g -std=c++11

我真的不知道出了什么問題,因為與沒有模板的純類相同的代碼可以正常工作。

我真的不知道出了什么問題,因為與沒有模板的純類相同的代碼可以正常工作。

這是因為基類(類模板A )不是非依賴基類,在不知道模板參數的情況下無法確定其類型。 a是一個非獨立名稱。 在依賴基類中不查找非依賴名稱。

要更正代碼,您可以使名稱a從屬名稱,只能在實例化時查找從屬名稱,屆時必須探索確切的基礎專業化並將其知曉。

你可以

void test() { std::cout << "testing... " << this->a << std::endl; };

或者

void test() { std::cout << "testing... " << A<T>::a << std::endl; };

或者

void test() { 
    using A<T>::a;
    std::cout << "testing... " << a << std::endl; 
};

暫無
暫無

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

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