Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 可变模板中的可变模板推导_C++_Templates_C++11_Variadic Templates - Fatal编程技术网

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。感谢您指出这一点!正如你所说,这不是一个普遍的解决方案,但却是一个很好的临时解决办法。