template<typename T>
class Base
{
protected:
Base() {}
T& get() { return t; }
T t;
};
template<typename T>
class Derived : public Base<T>
{
public:
Base<T>::get; // Line A
Base<T>::t; // Line B
void foo() { t = 4; get(); }
};
int main() { return 0; }
如果我註釋掉線A和B,該代碼的Visual Studio 2008下編譯罰款然而,當我GCC 4.1線A和B評論下編譯,我得到這些錯誤:爲什麼GCC在模板中需要額外的聲明?
In member function ‘void Derived::foo()’:
error: ‘t’ was not declared in this scope
error: there are no arguments to ‘get’ that depend on a template parameter, so a declaration of ‘get’ must be available
爲什麼一個編譯器需要A行和B行,而另一個不行?有沒有辦法簡化這個?換句話說,如果派生類使用基類中的20個東西,我必須爲從Base派生的每個類放置20行聲明!有沒有解決這個問題的方法,不需要太多的聲明?
的強制性鏈接到C++ FAQ:http://www.parashift.com/c++-faq- lite/templates.html#faq-35.19 – UncleBens 2010-05-11 16:31:57
簡短回答:因爲gcc符合標準,而且(令人驚訝的)Visual C++不是? 「錯誤地」是 – 2010-05-11 16:57:20