访问仿函数中的 using 声明:范围相关问题
Accessing a using declaration within a functor: a scope related question
以下测试代码无法编译:
#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
这不是 using
独有的,这就是语言的工作方式。
您的 using
仅在块范围内有效,更具体地说,从您的 using
声明存在到块范围结束的那一刻起。
您的代码不起作用的原因与此代码不起作用的原因相同:
std::cout << foo;
int foo = 0;
以下测试代码无法编译:
#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
这不是 using
独有的,这就是语言的工作方式。
您的 using
仅在块范围内有效,更具体地说,从您的 using
声明存在到块范围结束的那一刻起。
您的代码不起作用的原因与此代码不起作用的原因相同:
std::cout << foo;
int foo = 0;