gpt4 book ai didi

c++ - 自动类型到自动方法失败。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:57 26 4
gpt4 key购买 nike

作为学习练习,我正在构建一个类来管理主要的旧熟悉 argc 和 argv 值。我将 argv 存储为 std::strings 的 std::vector。目前我想遍历我的对象,就好像它是 vector 一样。我遇到的问题是我的解决方案变得高度依赖于我对容器的选择,并且当我尝试修复它时编译器会中断。观察:

这是我希望我的类(class)在此示例中工作的方式。

int main(int argc, char* argv) {
CLI options(argc, argv);

for (auto option : options) {
cout << option << endl;
}
}

这是相当微不足道的,但确实需要花点时间研究一下。这是我的头文件

typedef char* cstring;

class CLI {
std::vector<std::string> arguments;
public:
CLI(const int argc, const cstring argv[]);

std::vector<std::string>::const_iterator begin();
std::vector<std::string>::const_iterator end();
};

和我的 CLI 类的源文件。 (减去包括等)

CLI::CLI(const int argc, const cstring argv[]) {
arguments = std::vector<std::string>(argv, argv + argc);
}

std::vector<std::string>::const_iterator CLI::begin() {
return arguments.begin();
}

std::vector<std::string>::const_iterator CLI::end() {
return arguments.end();
}

效果很好,但这是我的第一个问题。如果我决定我希望使用链表而不是 vector ,我现在至少有五个地方需要改变,如果我的客户端代码有一个愚蠢的一天并且没有使用 auto 循环(或其他任何东西)否则它会)。这感觉应该是自动救援的情况!使用新的 C++ 功能,我应该能够将方法签名更改为:

... // Header
auto begin();

... // Source
// Possibly without the decltype now? Not sure how or when...
auto CLI::begin() -> decltype(arguments.begin()) {
return arguments.begin();
}

这是我最终遇到错误的地方:

.../main.cpp: In function ‘int main(int, char**)’:
.../main.cpp:10:22: error: use of ‘auto CLI::begin()’ before deduction of ‘auto’
for (auto option : options) {
^
.../main.cpp:10:22: error: invalid use of ‘auto’

好的。如果我不得不猜测这意味着什么,我会说 for 循环中的 auto 正在查找 begin 方法的签名,希望找到具体的返回类型。相反,它发现的是自动和 panic 。

那么,这个理论是否正确,是否有更好的方法来隐藏容器类型而不考虑迭代器?

附言我越看这个问题,就越意识到这个功能可能不是我想要在最终产品中使用的功能。但这似乎仍然是一个学习东西的机会。

最佳答案

由于header不包含code,main.cpp的编译单元无法推导出begin()auto的含义

这会更好地满足您的需求:

Header.h

#include <vector>                                                                  

class A {
public:
std::vector<int> a;
decltype(a.begin()) begin();
decltype(a.cbegin()) cbegin() const;
};

Header.cpp

#include "header.h"
decltype(A::a.begin()) A::begin() {
return a.begin();
}
decltype(A::a.cbegin()) A::cbegin() const {
return a.cbegin();
}

main.cpp

#include "header.h"
int main(int argc, char **argv) {
A a;
auto b = a.begin();
auto cb = a.cbegin();
return 0;
}

关于 const 安全的注意事项:记住“const_iterator”是一种独特的类型,它本身不一定是 const,但它代表的对象是 const。这意味着类型不同,这会阻止您在 const 函数内返回 a.begin()。天真的人可能会尝试添加 const decltype(a.begin()) 返回类型,但这仍然不是 vector::const_iterator 而是 const vector::迭代器.

关于c++ - 自动类型到自动方法失败。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623080/

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