10

我不确定这个标题是否有意义,但这个例子实际上很简单:

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

我已经尝试使用 GCC 4.8.1 和 clang 3.3,错误消息有所不同,但它们都指向Args在第 5 行附近推断出的一些问题(以及随后converter从候选列表中排除构造函数)。

foo_variadic2对于其他foos 有何特殊或不同?

(作为记录,我正在尝试实现一个is_instance_of类型特征来检测模板类的实例)

更新

现在我的设置中的 GCC 4.8.3 和 4.9.1 都接受了这个。clang 3.4.2 还在吠叫。

4

1 回答 1

1

这不是解决方案,但可能会帮助您或其他人找出问题所在。以下编译:

template <template <typename ...> class TT>
struct converter2
{
    template <typename Arg0, typename ... Args>    
    converter2(const TT<Arg0, Args ...> &);
};

// ...

converter2<foo_variadic2>(foo_variadic2<int>{});

我不得不承认我不明白为什么这是必要的以及为什么你的代码不起作用。

于 2013-09-10T17:12:37.657 回答