C++ MinGW无法将从模板类继承的内容识别为模板
MinGW(gcc版本4.8)未能编译以下代码: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
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);
}