龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

从VC++到GCC移植:谈两者的语法差异

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
类型引用 template class T class Foo { typedef T::SomeType SomeType; }; 这段代码在VC++中一点问题也没有,但是GCC并不允许,因为它不知道T::SomeType是什么。你需要改为: template class T class Foo { typede

类型引用
template <class T>
class  Foo
{
    typedef T::SomeType SomeType;
};
这段代码在VC++中一点问题也没有,但是GCC并不允许,因为它不知道T::SomeType是什么。你需要改为:

template <class T>
class  Foo
{
    typedef typename T::SomeType SomeType;
};
通过typename T::SomeType告诉GCC,SomeType是一个类型名,而不是其他东西。

当然,这种情况不只是出现在typedef中。例如:

template <class Container>
void visit(const Container& cont)
{
    for (Container::const_iterator it = cont.begin(); it != cont.end(); ++it)
         ...
}
这里的Container::const_iterator同样需要改为typename Container::const_iterator。

基类成员引用
template <class Base>
class Foo : public Base
{
public:
    void foo() {
         base_func();
         m_base_member = 0;
    }
};
这段代码在VC++中同样没有问题,但是GCC中不能通过。因为GCC并不知道base_func,m_base_member是什么。对于这个问题,你可以有两种改法:

改法1:加上域作用符Base::
template <class Base>
class Foo : public Base
{
public:
    void foo() {
         Base::base_func();
         Base::m_base_member = 0;
    }
};
改法2:使用using指示符
template <class Base>
class Foo : public Base
{
public:
    using Base::base_func;
    using Base::m_base_member;

    void foo() {
         base_func();
         m_base_member = 0;
    }
};

精彩图集

赞助商链接