2010-09-10 73 views
5

$ 14.6.2/3 - 「在類模板或類模板成員的定義中,如果類模板的基類依賴於模板參數,則基類作用域不是在定義類模板或成員時或在類模板或成員的實例化過程中,在非限定名稱查找過程中進行檢查。「模板+從屬名稱

根據這個,撥打電話'f(0)''D::g'應撥打'B:f'。然而gcc(IdeOne)給出了一個模糊錯誤。

這是gcc中的錯誤嗎?科莫編譯它很好

template<class T, class U> struct A{ 
    template<class A, class B> A f(B b){A a; return a;} 
}; 

struct B{ 
    double f(double d){return 0.0;} 
}; 

template<class T, class U> struct D : A<T, U>, B{ 
    void g(){f(0);} 
}; 

int main(){ 
    D<double, double> d; 
    d.g(); 
} 
+0

VS 2008也給出了模糊性錯誤。 – 2010-09-10 13:14:05

+3

我認爲GCC在'B'中找到'f'並且過早地添加隱式類成員訪問'this-> f(0)',這使得GCC在實例化時在'A '中查找。這是錯誤的方式 - 請參閱http://llvm.org/bugs/show_bug.cgi?id=5838 – 2010-09-10 13:27:58

+0

@Johannes Schaub - litb:謝謝 – Chubsdad 2010-09-10 16:11:14

回答

5

我認爲這是一個在GCC的known bug。根據錯誤報告,你的例子遲到了GCC 4.4.0。我認爲這僅僅意味着它尚未在新版本上進行過測試 - 並不是它已被修復。

+0

誓言!感謝您的參考 – Chubsdad 2010-09-10 16:11:44