这段代码用clang编译并运行良好,但是gcc给出了编译错误:
没有匹配函数来调用'unpack(tag1,A3&)'
它是有效的c ++吗?
{{1}}
答案 0 :(得分:2)
Tag
位于每个函数参数(Tag
和Pack<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)将失败。