簡體   English   中英

派生類中的模板函數參數

[英]Template function argument in derived class

我想知道為什么下面的代碼不能用gcc(4.6.3)編譯,而使用cl可以正常工作。 我顯然可以通過刪除DoSomething函數的template參數使用gcc對其進行編譯。 盡管如此,我想了解為什么以下語法不正確。

感謝您的任何提示。

template <class T>
class Base {
public:
    template <class B>
    struct Var1 {
        B var1_var;
    };

    Base() {};
    ~Base() {};
    template <class V> void DoSomething(V val) {
        std::cout << val.var1_var << std::endl;
    }
};

template <class T>
class Derived : public Base<T> {
public:
    Derived() {};
    ~Derived() {};
    void Test() {
        typename Base<T>::template Var1<int> val;
        val.var1_var = 5;
        Base<T>::DoSomething<typename Base<T>::template Var1<int> >(val);   //error: expected ‘(’ before ‘>’ token
    }
};

int main(int, char**) {
    Derived<double> bla;
    bla.Test();
    return 0;
}

問題在於Test是一個nondependant name dependant nondependant name (不涉及T ),因此編譯器在查找函數Dosomething時不會在dependant基類中查找。 您可以像以前一樣解決此問題(使用0x499602D2的答案),但是它將不允許虛擬分派機制。 您也可以僅使用this->DoSomething(val)解決此問題,這將啟用虛擬調度。

更多信息在這里

您需要另一個template

Base<T>::template DoSomething<typename Base<T>::template Var1<int> >(val);
//       ^^^^^^^^

更新:您也不需要提供template參數。 您可以允許模板參數推導為您完成:

DoSomething(val);

暫無
暫無

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

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