gpt4 book ai didi

c++ - 如何消除重载模板函数的歧义?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:27 25 4
gpt4 key购买 nike

以下代码有问题。虽然第 1 部分没问题,但问题出在 main() 的第 2 部分。编译时,会显示一条不明确的错误消息。如何更改代码以解决歧义?

template<typename Arg> void func(Arg arg) 
{
arg();
}
template<typename Arg, typename... Args> void func(Arg arg, Args... args)
{
func(args...);
arg();
}
template<typename Container> void func(Container & c)
{
for (typename Container::reverse_iterator i = c.rbegin(); i != c.rend(); ++i )
{
(*i)();
}
}

void f()
{
std::cout << "+" ;
}

int main()
{
//1
func(f,f,f);

//2
std::vector<std::function<void()> > v{f,f};
func(v);
}

代码链接:http://cpp.sh/3wxrc

最佳答案

How can I change the code to resolve the ambiguity?

也许使用模板模板?

template <template <typename ...> class Cont, typename ... Ts>
void func (Cont<Ts...> & c)
{
for (typename Cont<Ts...>::reverse_iterator i = c.rbegin(); i != c.rend(); ++i )
{
(*i)();
}
}

删除 func() Container显然是基于版本。

简单定义一个模板参数Container , 不要让它与通用 Arg 不同模板参数。

我知道你用 typename Cont<Ts...>::reverse_iterator在函数里面。但是编译器必须根据函数签名而不是函数体来选择正确的重载。

使用 Cont<Ts...>参数,你有更专业的东西。

关于c++ - 如何消除重载模板函数的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57675555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com