gpt4 book ai didi

c++ - MinGW 不将从模板类继承为模板

转载 作者:行者123 更新时间:2023-11-30 04:04:59 26 4
gpt4 key购买 nike

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);
}

潜在的错误似乎是:

can't deduce a template for 'TC<TV>' from non-template type 'QStringList'

但是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 一起使用的第一个选项?

最佳答案

MinGW 是正确的。应该不可能推断出 TCTV来自 QStringList仅仅因为QStringList是模板的派生类。在标准(C++11,§14.8.2.5/8)和 TT<T> 中有一个函数调用的推导上下文列表。是其中之一,其中 TT是模板模板参数,T是模板类型参数。但是,派生自模板特化的类本身并不是模板特化。此外,虽然类型为 QStringList 的左值可隐式转换为 QList<QString> ,模板参数推导不考虑大多数类型的隐式转换。

此外,是的,您确实需要 typename .有关原因的解释,请参阅 Where and why do I have to put the "template" and "typename" keywords?

该标准还规定允许实现接受根据该标准格式错误的代码作为扩展。 Visual C++ 有很多扩展,因此它接受很多不符合标准的代码。

关于c++ - MinGW 不将从模板类继承为模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23528470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com