[英]MinGW does not recognize inherited from template class as a template
MinGW(gcc版本4.8)無法編譯以下代碼:
template<template<typename> class TC, typename TV> void foo(TC<TV> & container)
{
// I need to deal with container items type here
std::cout << sizeof(TV);
}
int main()
{
QStringList list;
foo(list);
}
潛在的錯誤似乎是:
無法從非模板類型“ QStringList”推斷出“ TC <TV>”的模板
但是QStringList
是標准的Qt類型,聲明如下:
class QStringList : public QList<QString> { ... };
因此,我希望它也是模板。
一些注意事項:
MSVC ++ 2010能夠正確編譯該代碼。
我還可以通過以下更改在MinGW中獲得工作代碼:
template<class TC> void foo(TC & container)
{
// container items type is resolved via TC::value_type here
std::cout << sizeof(typename TC::value_type);
}
但是我認為這會使foo()
的聲明難以理解,並且會稍微改變含義,所以我寧願選擇第一個選項,即TC<TV>
問題是:
從標准的角度來看,第一種選擇是否正確?
MinGW是否可以使用第1個選項?
不,不。 標准要求typename關鍵字用於相關名稱。 MSVC不允許這樣做。 涉及標准合規性時,切勿信任MSVC。 他們只是永遠不會完全正確。
MinGW是正確的。 僅僅因為QStringList
是模板的派生類,就不可能從QStringList
推斷TC
和TV
。 在標准(C ++ 11,§14.8.2.5/ 8)中提供了一系列函數推導的上下文,並且TT<T>
是其中之一,其中TT
是模板模板參數, T
是模板類型參數。 但是,從模板專業化派生的類本身不是模板專業化。 此外,盡管類型QStringList
的左值可隱式轉換為QList<QString>
,但是模板參數推導不考慮大多數類型的隱式轉換。
另外,是的,您確實需要typename
。 有關原因的說明,請參閱在何處以及為什么必須在其中放置“ template”和“ typename”關鍵字?
該標准還說,允許實現接受根據標准格式不正確的代碼作為擴展。 Visual C ++具有許多擴展,因此它接受許多不符合標准的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.