模棱两可的模板实例化
Posted
技术标签:
【中文标题】模棱两可的模板实例化【英文标题】:Ambiguous template instantiation 【发布时间】:2018-05-10 18:59:30 【问题描述】:有人可以解释这里的歧义吗?
template <typename...> struct thing;
template <typename... Rest>
struct thing<int&, Rest&...>
thing(int&, Rest&...)
;
template <typename First, typename... Rest>
struct thing<First&, Rest&...>
thing(First&, Rest&...)
;
int main()
int myint;
char mychar;
thing<int&, char&> t(myint, mychar);
【问题讨论】:
嗯,你指的是哪个?需要 1 + 其他 args 的那个,还是需要 2 + 其他 args 的那个? 第一个专业不是比第二个专业吗?它应该自动取第一个,对吧? 这可能是编译器错误。 您可以使用template <typename ... Ts> struct thing<Ts&...> : thing_for_ref<Ts...>
(然后专门化thing_for_ref
)作为解决方法。
使用 SFINAE 的工作解决方法:wandbox.org/permlink/cPGy0K4I5BR2EWIm
【参考方案1】:
如果你专注于 int
而不是 int&
它可以工作
template <typename...> struct thing;
template <typename... Rest>
struct thing<int, Rest...>
thing(int&, Rest&...)
;
template <typename First, typename... Rest>
struct thing<First, Rest...>
thing(First&, Rest&...)
;
【讨论】:
以上是关于模棱两可的模板实例化的主要内容,如果未能解决你的问题,请参考以下文章