gpt4 book ai didi

c++ - 如何缩短此方法签名?

转载 作者:太空宇宙 更新时间:2023-11-04 14:52:22 25 4
gpt4 key购买 nike

我有以下类,其方法签名如下:

class Foo
{
public:
std::vector<std::string> barResults(const std::vector<std::string>&, const std::vector<std::string>&);
}

在实现文件中,我有这个:

std::vector<std::string> Foo::barResults(const std::vector<std::string>& list1, const std::vector<std::string>& list2)
{
std::vector<std::string> results;
// small amount of implementation here...
return results;
}

所以我想,让我们看看我是否可以使用一些自动魔法来稍微简化这个函数签名,因为它变得“有点满了”!所以我尝试了这个...

class Foo
{
public:
auto barResults(const std::vector<std::string>&, const std::vector<std::string>&);
}

auto Foo::barResults(const std::vector<std::string>& list1, const std::vector<std::string>& list2)
{
std::vector<std::string> results;
// small amount of implementation here...
return results;
}

现在忽略了这样一个事实,是的,我可以使用“使用命名空间标准”来大幅减少它,我想知道为什么编译器给我一个错误“返回‘auto’的函数不能在定义之前使用”

我个人认为编译器可以很容易地推断出方法的返回类型,但在这种情况下似乎并非如此。当然,您可以使用如下所示的尾随返回类型来修复它:

class Foo
{
public:
std::vector<std::string> barResults(const std::vector<std::string>&, const std::vector<std::string>&) -> std::vector<std::string>;
}

但是如果你使用上面的,它并不比以前更好。那么,除了“使用命名空间标准”之外,是否有更好的方法来执行上述操作,为什么编译器不能在这种情况下推断出返回类型?甚至,是否取决于此方法的调用方式导致编译器无法确定返回类型。

最佳答案

这里的问题是包含文件如何工作的问题。你的错误:

a function that returns 'auto' cannot be used before it is defined

意味着在文件中你正在使用你的函数,它的定义(即实现)在使用之前不在文件中的任何地方。这意味着使用函数编译代码的编译器无法推断函数返回类型,因为这需要访问定义(实现)。最可能的原因是函数的定义(实现)在其自己的源文件(.cpp、.c 等)中,未包含在内。为了更全面地理解这一点,我建议阅读 this回答,也许this也回答一下。


要解决标题问题,缩短该签名的最简单方法可能是使用 typedef。更具体地说,您可以在适当的地方添加以下代码,前提是范围适当(我会将其作为公共(public)成员添加到您的类中):

typedef std::vector<std::string> strvec;

这允许您重写方法签名,使其更易于管理:

strvec barreuslts(const strvec&, const strvec&)

关于c++ - 如何缩短此方法签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853897/

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