为何using std::string::size_type无法在全局作用域像std::cout那样使用?
解决非类作用域中
using std::string::size_type的编译错误 C++标准不允许在**非类作用域(比如全局作用域)**直接使用using声明类的嵌套成员类型(如std::string::size_type),这就是你遇到GCC和MSVC报错的核心原因。而std::cout这类是命名空间下的直接成员,因此可以在全局作用域直接用using std::cout;声明。
以下是几种可行的修改方案:
方案1:使用别名声明替代成员using声明
在全局作用域通过别名定义来实现需求,这是符合标准的写法:#include <iostream> #include <string> using std::cout; using std::cin; using std::endl; using std::string; using size_type = std::string::size_type; // 用别名声明替代成员using void Part_2() { string s1, s2; cout << "Enter the first string" << endl; cin >> s1; cout << "Enter the second string" << endl; cin >> s2; size_type s1Size = s1.size(); size_type s2Size = s2.size(); }方案2:将成员using声明移到局部作用域
类成员的using声明可以放在函数内部的局部作用域中,这样编译器就不会报错:#include <iostream> #include <string> using std::cout; using std::cin; using std::endl; using std::string; void Part_2() { using std::string::size_type; // 移到函数内部的局部作用域 string s1, s2; cout << "Enter the first string" << endl; cin >> s1; cout << "Enter the second string" << endl; cin >> s2; size_type s1Size = s1.size(); size_type s2Size = s2.size(); }方案3:直接使用限定名
既然已经通过using std::string;引入了string类型,直接在代码中使用string::size_type即可,无需额外的using声明:#include <iostream> #include <string> using std::cout; using std::cin; using std::endl; using std::string; void Part_2() { string s1, s2; cout << "Enter the first string" << endl; cin >> s1; cout << "Enter the second string" << endl; cin >> s2; string::size_type s1Size = s1.size(); // 直接使用限定名 string::size_type s2Size = s2.size(); }
内容的提问来源于stack exchange,提问作者ZoomIn
相关产品推荐
相关产品推荐

