Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MinGW无法将从模板类继承的内容识别为模板_C++_Qt_Templates_C++11_Mingw - Fatal编程技术网

C++ MinGW无法将从模板类继承的内容识别为模板

C++ MinGW无法将从模板类继承的内容识别为模板,c++,qt,templates,c++11,mingw,C++,Qt,Templates,C++11,Mingw,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 l

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);
}
所以,我希望它也是模板

一些注意事项:
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和容器)
{
//容器项目类型在此处通过TC::value\u类型解析

std::coutNo,No。标准要求依赖名称使用typename关键字。MSVC不允许这样做。当涉及到标准遵从性时,永远不要相信MSVC。他们从来都不是完全正确的。

MinGW是正确的。应该不可能从
QStringList
中推断
TC
TV
y,因为
QStringList
是模板的派生类。标准(C++11,§14.8.2.5/8)中有函数调用的派生上下文列表其中,
TT
是一个模板参数,
TT
是一个模板类型参数,
T
是一个模板类型参数。但是,从模板专门化派生的类本身并不是一个模板专门化。此外,类型为
QStringList
的左值可以隐式转换为
QList
,模板参数推导不考虑大多数类型的隐式转换。

另外,是的,您确实需要
typename
。有关原因的解释,请参阅

标准还表示,允许一个实现接受标准中不合格的代码作为扩展。VisualC++有很多扩展,因此它接受许多不符合标准的代码。

template<class TC> void foo(TC & container)
{
    // container items type is resolved via TC::value_type here
    std::cout << sizeof(typename TC::value_type);
}