练习18.12 //。。。
练习18.13 什么时候应该使用未命名的命名空间?
在某个给定的文件内使用,但是不跨越多个文件。
练习18.14 假设下面的operator*声明的是嵌套的命名空间mathLib::MatrixLib的一个成员:
namespace mathLib {
namespace MatrixLib {
class matrix{};
matrix operator*(const matrix&, const matrix&);
//...
}
}
请问你应该如何在全局作用域中声明该运算符。
mathLib::MatrixLib::matrix mathLIb::MatrixLib::operator*(const matrix&, const matrix&);
练习18.15 说明using指示和using声明的区别。
一条using声明语句一次只引入命名空间的一个成员。
using指示使得某个特定的命名空间中所有的名字都可见,这样我们就无须再为它们添加任何前缀限定符,可不能出现在类的作用域中。
练习18.16 && 18.17假定在下面的代码中标记为“位置1”的地方是对于命名空间Exercise中所有成员的using声明,请解释代码的含义。如果这些using声明出现在“位置2”又会怎样呢?将using声明编程using指示,重新回答之前的问题。并检验你的回答。
#include <iostream>
using namespace std;
namespace Exercise {
int ivar = 0;
double dvar = 0.0;
const int limit = 1000;
}
int ivar = 0;
//using Exercise::ivar; // 重复声明了ivar,编译不通过。
using Exercise::dvar;
using Exercise::limit;
void mainp()
{
double dvar = 3.14146;
cout << "dvar = " << dvar << endl;
int iobj = limit + 1;
cout << "iobj = " << iobj << endl;
++ivar;
cout << "ivar = " << ivar << endl;
++::ivar;
cout << "::ivar = " << ::ivar << endl;
}
int main()
{
mainp();
}
#include <iostream>
using namespace std;
namespace Exercise {
int ivar = 7;
double dvar = 0.0;
const int limit = 1000;
}
int ivar = 0;
void mainp()
{
using Exercise::ivar;
//using Exercise::dvar; //重复声明
using Exercise::limit;
double dvar = 3.14146;
cout << "dvar = " << dvar << endl;
int iobj = limit + 1;
cout << "iobj = " << iobj << endl;
++ivar; //ivar of Exercise
cout << "ivar = " << ivar << endl;
++::ivar; //ivar of mainp
cout << "::ivar = " << ::ivar << endl;
}
int main()
{
mainp();
}
#include <iostream>
using namespace std;
namespace Exercise {
int ivar = 0;
double dvar = 0.0;
const int limit = 1000;
}
int ivar = 0;
using namespace Exercise;
//错误和“位置1”的using声明是一样的,ivar不明确。
void mainp()
{
double dvar = 3.14146;
cout << "dvar = " << dvar << endl;
int iobj = limit + 1;
cout << "iobj = " << iobj << endl;
++ivar;
cout << "ivar = " << ivar << endl;
++::ivar;
cout << "::ivar = " << ::ivar << endl;
}
int main()
{
mainp();
}
练习18.18 已知有下面的swap的典型定义(13.3节,第457页),当mem1是一个string时程序使用swap的哪个版本?如果mem1是int呢?说明在这两种情况下的查找过程。
void swap(T v1, T v2)
{
using std::swap;
swap(v1.mem1, v2.mem1);
//交换类型T的其他成员
}
string的情况:
std::swap — 使用string类的swap
int的情况:
std::swap — 使用实例化int类的swap
练习18.19 如果对swap的调用形如std::swap(v1.mem1, v2.mem1)将发生什么情况?
swap函数限定是string类中的版本。int类型的也能实例化。
练习18.20 在下面的代码中,确定哪个函数与compute调用匹配。列出所有候选函数和可行函数,对于每个可行函数的实参与形参匹配过程来说,发生了哪种类型转换?
namespace primerLib {
void compute(); 1
void compute(const void *); 2
}
using primerLib::compute;
void compute(int); 3
void compute(double, double = 3.4); 4
void compute(char*, char *= 0); 5
void f()
{
compute(0);
}
候选函数和可行函数:2 3 4 5
最佳匹配:3
如果将using声明置于f函数中compute的调用点之前将发生什么情况?重新回答之前的那些问题。
候选函数和可行函数:3 4 5 对于f(),2不可见
最佳匹配:3