亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

派生模板-對基類成員的類訪問-數據

派生模板-對基類成員的類訪問-數據

C++
烙印99 2019-06-19 16:30:15
派生模板-對基類成員的類訪問-數據這個問題是本文所提問題的進一步。這條線.使用以下類定義:template <class T>class Foo {public:     Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)     {         /* do something for foo */     }     T Foo_T;        // either a TypeA or a TypeB - TBD     foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public:     Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)     : Foo<T>(bar_arg)   // base-class initializer     {         Foo<T>::Foo_T = T(a_arg);     }     Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)     : Foo<T>(bar_arg)     {         Foo<T>::Foo_T = T(b_arg);     }     void BarFunc ();};template <class T>void Bar<T>::BarFunc () {     std::cout << _foo_arg << std::endl;   // This doesn't work - compiler error is: error: ‘_foo_arg’ was not declared in this scope     std::cout << Bar<T>::_foo_arg << std::endl;   // This works!}在訪問模板類的基類成員時,似乎必須始終使用模板樣式語法對成員進行顯式限定。Bar<T>::_foo_arg..有辦法避免這種情況嗎?“使用”語句/指令能否在模板類方法中發揮作用以簡化代碼?編輯:通過使用以下->語法對變量進行限定來解決范圍問題。
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

在Visualc+2008中工作得很好。我為您提到的類型添加了一些虛擬定義,但沒有給出源代碼。其余的和你說的完全一樣。然后主要作用是BarFunc實例化和調用。

#include <iostream>class streamable {};std::ostream &operator<<(std::ostream &os, streamable &s) { return os; }class foo_arg_t : 
public streamable {};class a_arg_t : public streamable {};class b_arg_t : public streamable  {};template <class T>class Foo {public:
    Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
    {
        /* do something for foo */
    }
    T Foo_T;        // either a TypeA or a TypeB - TBD
    foo_arg_t _foo_arg;};template <class T>class Bar : public Foo<T> {public:
    Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
    : Foo<T>(bar_arg)   // base-class initializer
    {

        Foo<T>::Foo_T = T(a_arg);
    }

    Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
    : Foo<T>(bar_arg)
    {
        Foo<T>::Foo_T = T(b_arg);
    }

    void BarFunc ();};template <class T>void Bar<T>::BarFunc () {
    std::cout << _foo_arg << std::endl; 
    std::cout << Bar<T>::_foo_arg << std::endl;   }int main(){
    Bar<a_arg_t> *b = new Bar<a_arg_t>(foo_arg_t(), a_arg_t());
    b->BarFunc();}


查看完整回答
反對 回復 2019-06-19
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

在這里,基類不是一個非依賴的基類(這意味著一個具有可以在不知道模板參數的情況下確定的完整類型的基類),并且_foo_arg是一個非依賴的名稱。標準C+說,在依賴基類中不查找非依賴的名稱。

若要更正代碼,只需創建名稱即可。_foo_arg依賴的原因是,只有在實例化時才能查找依賴的名稱,并且在那個時候,必須探索的確切的基本專門化將被知道。例如:

// solution#1std::cout << this->_foo_arg << std::endl;

另一種方法是使用限定名引入依賴項:

// solution#2std::cout << Foo<T>::_foo_arg << std::endl;

必須注意此解決方案,因為如果使用不限定的非依賴名稱來形成虛擬函數調用,則限定會抑制虛擬調用機制,程序的含義也會發生變化。

之后,您可以從派生類中的依賴基類中帶一個名稱。using:

// solution#3template <class T>class Bar : public Foo<T> {public:
    ...
    void BarFunc ();private:
    using Foo<T>::_foo_arg;};template <class T>void Bar<T>::BarFunc () {
    std::cout << _foo_arg << std::endl;   // works}


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 535 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號