Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990809
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-26 16:00:48

// 代码来源于csdn.net,但去掉不相干内容
#include
#include
#include
#include
using namespace std;

namespace std // 注意这一句
{
ostream& operator<< (ostream& os, const vector& coll)
{
    for(size_t i=0; i        os << coll[i] << " ";
    return os;
}
}

int main()
{
    vector > coll( 4, vector(5,1) );
    copy( coll.begin(), coll.end(), ostream_iterator >(cout,"\n") );

    return 0;
}

将int换成自定义类型,或将vector包含于一个自定义类型内部时,则不需要namespace std。
因为编译器会在 函数所在名字空间,及函数参数所在名字空间 内寻找最匹配重载。这里的copy,vector都在std名字空间内,所以编译器不会在全局名字空间内寻找ostream& operator<< (ostream& os, const vector& coll),因此编译失败。对于int等内建类型,不算在任何名字空间内。

同样
#include
#include

struct v1 : std::vector
{
};

struct v2
{
    typedef int reference;
};

int main()
{
    std::vector a;
    back_inserter( a ); // 因为 vector 在名字空间 std 中,所以编译器回去std中查找back_inserter

    v1 b;
    back_inserter( b );

    v2 c;
    back_inserter( c ); // 报错,back_inserter未申明
}

// 代码来源于pfan.cn,但去掉不相干内容
class A
{
};

class B : private A
{
    void foo()
    {
        A* p = 0;
    }
};

class C : public B
{
    void foo()
    {
        A* p = 0; // 此句报错
    }
};

VC9言:error C2247: 'A' not accessible because 'B' uses 'private' to inherit from 'A'
GCC4.5曰:error: 'class A A::A' is inaccessible
B中 A* p = 0 相当于 B::A* p = 0, 所以应当改为 ::A* p = 0,编译通过。
在B中,A是私有的,则在C中,A是不可以直接访问的,这是编译出错的原因。

// 代码来源于cppblog.com,但去掉不相干内容
struct A { virtual ~A(){} };
struct B: A { virtual ~B(){} };

struct C
{
    const A& GetB() const
    {
        return b;   // ①
    }
    const shared_ptr& GetBptr() const
    {
        return pb;  // ②
    }
    const double& GetInt() const
    {
        return c;   // ③
    }

    B b;
    shared_ptr pb;
    int c;
};

VC9言:②warning C4172: returning address of local variable or temporary
GCC4.5曰:②warning: returning reference to temporary
shared_ptr
并不是shared_ptr的基类,所以不可以公用同一块内存。为了说明问题,我特意加上了③,本质一样,所以它和②报同样的警告。

阅读(1392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~