这个模板的功能是否正确匹配具有多个碱基的类?

时间:2015-06-13 04:09:52

标签: c++

这段代码用clang编译并运行良好,但是gcc给出了编译错误:

  

没有匹配函数来调用'unpack(tag1,A3&)'

它是有效的c ++吗?

{{1}}

2 个答案:

答案 0 :(得分:2)

Tag位于每个函数参数(TagPack<Tag, Value> &)的推导上下文中。模板参数推导是针对每个独立执行的,结果必须匹配。在尝试从Pack<Tag, Value>推断A3时,可能会有两种可能的扣除,因此类型扣除失败。

最简单的修复可能是摆脱了标记函数参数,而只是使用显式模板参数调用unpack - unpack<tag1>(a3)并不比unpack(tag1(), a3)更详细。如果您仍然喜欢原始语法,可以编写转发器:

template<class Tag, class SomePack>
decltype(auto) unpack(Tag, SomePack& pack) { return unpack<Tag>(SomePack); }

答案 1 :(得分:0)

这不仅是多重继承的问题。这也是模板即时的问题。

表达式unpack(tag1(), a3)与具有签名unpack(tag1, Pack<tag1, A3> &)的函数的调用匹配,而return pack.value()在包类型为Pack<tag1, A3>时不明确。

这意味着decltype(auto)的编译器(假设C ++ 14)将失败。