簡體   English   中英

MinGW無法將繼承自模板類的內容識別為模板

[英]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推斷TCTV 在標准(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.

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