在函子中访问using声明:与范围相关的问题

时间:2019-05-15 06:46:24

标签: 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 = "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()中应可见,因为函子本身已在与{{1}相同的范围内定义}类型声明。显然,我缺少了一些东西。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这不是using所独有的,它是语言的工作方式。

您的using仅在块作用域中有效,更具体地说,从您的using声明存在到块作用域结束为止。

您的代码不起作用的原因与该代码不起作用的原因相同:

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