lio*_*ori 7 c++ polymorphism namespaces
我无法理解为什么这段代码不能编译:
namespace A {
class F {}; // line 2
class H : public F {};
}
namespace B {
void F(A::H x); // line 7
void G(A::H x) {
F(x); // line 9
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用gcc 4.3.3,错误是:
s3.cpp: In function ‘void B::G(A::H)’:
s3.cpp:2: error: ‘class A::F’ is not a function,
s3.cpp:7: error: conflict with ‘void B::F(A::H)’
s3.cpp:9: error: in call to ‘F’
Run Code Online (Sandbox Code Playgroud)
我认为,因为在第9行中没有名称空间前缀,所以F(x)应该只是明确的意思B::F(x).编译器尝试强制x转换为自己的超类.根据我的理解,它不应该.为什么这样做?
Kir*_*sky 11
那是因为编译器将在其参数的相同名称空间中搜索函数.编译器找到了A::F标识符,但它不是一个函数.结果你会得到错误.
据我所知,这是标准行为.
3.4.2依赖于参数的名称查找 当在函数调用(5.2.2)中使用非限定名称作为后缀表达式时,可以搜索在通常的非限定查找(3.4.1)中未考虑的其他名称空间,并且可以搜索名称空间 -可以找到范围友元函数声明(11.4),否则不可见.对搜索的这些修改取决于参数的类型(以及模板模板参数,模板参数的命名空间).
对于函数调用中的每个参数类型T,存在一组零个或多个关联的命名空间以及要考虑的一组零个或多个关联的类.命名空间和类的集合完全由函数参数的类型(以及任何模板模板参数的命名空间)决定.用于指定类型的Typedef名称和using-declarations对此集合没有贡献.命名空间和类的集合按以下方式确定......
此规则允许您编写以下代码:
std::vector<int> x;
// adding some data to x
//...
// now sort it
sort( x.begin(), x.end() ); // no need to write std::sort
Run Code Online (Sandbox Code Playgroud)
最后:由于核心问题218,一些编译器会编译有问题的代码而没有任何错误.
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |