gpt4 book ai didi

c++ - 访问仿函数中的 using 声明 : a scope related question

转载 作者:太空狗 更新时间:2023-10-29 21:32:06 27 4
gpt4 key购买 nike

以下测试代码无法编译:

#include <iostream>
#include <string>
#include <iterator>
#include <functional>

using std::string;
using std::function;
using std::cout;
using std::endl;

void process (string);

int main (void){

string s = "This string";

process (s);

return 0;
}

void process (string s){

function<void(iter_t,iter_t)>print = [&] (iter_t start, iter_t finish){

cout << *start << endl;
cout << *finish << endl;

return;
};

auto begin = s.begin();
auto end = s.end() - 1;

using iter_t = typeid(iterator_traits<begin>::iterator_category);

print(begin,end);

return;
}

我得到的编译错误是:

code.cpp: In function void process(std::string):
code.cpp:24:16: error: iter_t was not declared in this scope
function<void(iter_t,iter_t)>print = [&] (iter_t start, iter_t finish){

^~~~~~

我期望 using 类型别名声明 iter_t 应该在仿函数 print() 中可见,因为仿函数本身已经在与 using 类型声明相同的范围内定义。显然,我遗漏了一些东西。

最佳答案

首先,您的别名定义没有意义。你想要的是迭代器的类型。应该是

using iter_t = decltype(begin); 

或者

using iter_t = std::string::iterator;

其次,你必须将它移到函数的开头,在 print 的定义之前。

此外,我无法理解您的print 功能。它打印两个单独的字符。

修改后的代码:

#include <iostream>
#include <string>
#include <iterator>
#include <functional>

using std::string;
using std::function;
using std::cout;
using std::endl;

void process (string);

int main (void){

string s = "This string";

process (s);

return 0;
}

void process (string s){

using iter_t = std::string::iterator;

function<void(iter_t,iter_t)>print = [&] (iter_t start, iter_t finish){

cout << *start << endl;
cout << *finish << endl;

return;
};

auto begin = s.begin();
auto end = s.end() - 1;

print(begin,end);

return;
}

这个(正确的?)输出

T
g

关于c++ - 访问仿函数中的 using 声明 : a scope related question,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56143197/

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