C++ 可变模板中的可变模板推导
我不确定这个标题是否有意义,但这个例子实际上相当直截了当:C++ 可变模板中的可变模板推导,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,我不确定这个标题是否有意义,但这个例子实际上相当直截了当: // A converter struct with a generic constructor. template <template <typename ...> class TT> struct converter { template <typename ... Args> converter(const TT<Args ...> &
// A converter struct with a generic constructor.
template <template <typename ...> class TT>
struct converter
{
template <typename ... Args>
converter(const TT<Args ...> &);
};
// A few class templates.
template <typename T>
struct foo {};
template <typename T, typename U>
struct foo2 {};
template <typename ... Args>
struct foo_variadic {};
template <typename Arg0, typename ... Args>
struct foo_variadic2 {};
int main()
{
// All these compile.
converter<foo>(foo<int>{});
converter<foo2>(foo2<int,double>{});
converter<foo_variadic>(foo_variadic<>{});
converter<foo_variadic>(foo_variadic<int>{});
converter<foo_variadic>(foo_variadic<int,double>{});
// This will not compile.
// converter<foo_variadic2>(foo_variadic2<int>{});
}
//具有泛型构造函数的转换器结构。
模板
结构转换器
{
模板
转换器(常数TT&);
};
//一些类模板。
模板
结构foo{};
模板
结构foo2{};
模板
结构foo_变量{};
模板
结构foo_variadic2{};
int main()
{
//所有这些都可以编译。
转换器(foo{});
转换器(foo2{});
转换器(foo_可变{});
转换器(foo_可变{});
转换器(foo_可变{});
//这将无法编译。
//转换器(foo_variadic2{});
}
我尝试过GCC 4.8.1和clang 3.3,错误消息略有不同,但它们都指向在第5行周围推断Args
时出现的一些问题(随后将转换器
构造函数从候选列表中排除)
与其他foo
s相比,foo\u variadic2
有什么特殊之处或不同之处
(作为记录,我正在尝试实现一个类型trait的is\u instance\u来检测模板类的实例)
更新
现在,我的设置中的GCC4.8.3和4.9.1都接受这一点。叮当声3.4.2仍然在吠叫。这不是解决方案,但可能会帮助您或其他人找出问题所在。汇编如下:
template <template <typename ...> class TT>
struct converter2
{
template <typename Arg0, typename ... Args>
converter2(const TT<Arg0, Args ...> &);
};
// ...
converter2<foo_variadic2>(foo_variadic2<int>{});
模板
结构转换器2
{
模板
转换器2(常数TT&);
};
// ...
转换器2(foo_variadic2{});
我必须承认,我不明白为什么这是必要的,为什么你的代码不能工作。在更改了一行“converter(const TT&){}@DieterLück哪个版本的GCC后,使用g++它编译得很好?(您是否取消了对有问题的行的注释,或者您是否意外地按照发布的方式编译了代码?)。是另一个我不太明白的例子。哦,值得一提的是,您的示例适用于VS 2013 RC:P@DanielFrey哦,删除它无法编译的注释您的示例适用于GCC 4.9,但不适用于GCC 4.8或clang 3.3。感谢您指出这一点!正如你所说,这不是一个普遍的解决方案,但却是一个很好的临时解决办法。