在函子中访问 using 声明:与作用域相关的问题

Accessing a using declaration within a functor: a scope related question

提问人:Vinod 提问时间:5/15/2019 最后编辑:melpomeneVinod 更新时间:5/15/2019 访问量:87

问:

以下测试代码不编译:

#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){

                ^~~~~~

我期望类型别名声明应该在函子中可见,因为函子本身已在与类型声明相同的范围内定义。显然,我错过了一些东西。usingiter_tprint()using

使用 functor C++ 作用域

评论

2赞 JVApen 5/15/2019
你首先必须定义你的类型,而不是使用它。尝试将 using 移动到函数的第一行
1赞 melpomene 5/15/2019
std::cout << i << '\n'; int i = 42;也不起作用。
0赞 L. F. 5/15/2019
您的函数只打印两个单独的字符。这是可取的吗?print
0赞 Konrad Rudolph 5/15/2019
关于代码的注释:C++ 不需要声明空参数列表。所以不要使用它,这是货物崇拜编程。传递复杂类型,除非您打算制作副本。也就是说,您的函数应该具有签名 。为什么要声明为 ?只需直接使用 lambda。最后,删除多余的语句,它不会增加清晰度,只会变得混乱。voidconst&processvoid process(std::string const& s)printstd::functionreturn;

答:

1赞 L. F. 5/15/2019 #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赞 Hatted Rooster 5/15/2019 #2

这并不是独有的,而是语言的工作方式。using

Your 仅在块作用域中有效,更具体地说,从您的声明存在的那一刻起,直到块作用域结束。usingusing

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

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