C++ 访问函子中的using声明:一个与作用域相关的问题

C++ 访问函子中的using声明:一个与作用域相关的问题,c++,scope,using,functor,C++,Scope,Using,Functor,以下测试代码未编译: #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 = "T

以下测试代码未编译:

#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;
}
#包括
#包括
#包括
#包括
使用std::string;
使用std::函数;
使用std::cout;
使用std::endl;
无效过程(字符串);
内部主(空){
string s=“此字符串”;
过程;
返回0;
}
作废处理(字符串s){
functionprint=[&](iter\u t开始,iter\u t完成){

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

using iter_t = decltype(begin); 

第二,你必须把它移到函数的开头, 在定义
之前打印

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

修改代码:

#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;
}

这不是使用
所独有的,而是语言的工作方式

您的
using
仅在块范围内有效,更具体地说,从您的
using
声明存在到块范围结束

代码不工作的原因与此代码不工作的原因相同:

std::cout << foo;
int foo = 0;

<代码> > STD::CUT首先要定义类型,而不是使用它。尝试将函数移到函数的第一行>代码>:ST:::CUDE <代码>打印< /COD>函数只打印两个单独的字符。这是需要的吗?代码注释:C++不要求<代码> Value>代码>声明空参数列表。所以不要使用它,这是CARG。o邪教编程。通过
const&
传递复杂类型,除非您打算复制。也就是说,您的
进程
函数应具有签名
无效进程(std::string const&s)
。为什么要将
打印
声明为
std::function
?只需直接使用lambda即可。最后,删除冗余的
return;
语句,它不会增加清晰度,只会造成混乱。
#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
std::cout << foo;
int foo = 0;