类型引用
template
Foo
{ typedef T::SomeType SomeType;
};
这段代码在VC中点问题也没有但是GCC并不允许它不知道T::SomeType是什么你需要改为:
template
Foo
{
typedef typename T::SomeType SomeType;
};
通过typename T::SomeType告诉GCCSomeType是个类型名而不是其他东西
当然这种情况不只是出现在typedef中例如:
template
void visit(const Container& cont)
{
for (Container::const_iterator it = cont.begin; it != cont.end; it)
...
}
这里Container::const_iterator同样需要改为typename Container::const_iterator
基类成员引用
template
Foo : public Base
{
public: void foo
{ base_func; m_base_member = 0;
}
};
这段代码在VC中同样没有问题但是GCC中不能通过GCC并不知道base_funcm_base_member是什么对于这个问题你可以有两种改法:
改法1:加上域作用符Base::
template
Foo : public Base
{
public: void foo
{ Base::base_func;
Base::m_base_member = 0;
}
};
改法2:使用using指示符
template
Foo : public Base
{
public: using Base::base_func;
using Base::m_base_member;
void foo
{
base_func; m_base_member = 0;
}
};
这两种思路方法各有好处在 Foo中出现大量Base::base_func、m_base_member引用时使用using是方便而如果只有次那么思路方法1显得简短
交叉引用许可
SomeClass;
template Foo
{ public: void foo(SomeClass& a)
{ a.some_func;
}
void foo2
{ SomeClass a;
a.some_func;
}
};
SomeClass {
public: void some_func
{
...
}
};
由于VC对模板迟编译因此个模板类不只是可以个尚未出现类成员(或者访问其成员变量)甚至可以定义其例子这种语法对C来说确实显得怪异等到编译后面SomeClass时他又可以在其中定义 Foo例子从而出现交叉引用情况这在非模板情形下就算你用VC亦难以做到
遇到这种情况该如何移植到GCC中?这个问题有点棘手我个人认为出现这种情况是不太应该这意味着对类和类的间关系混淆不清你需要仔细审视下这两个类正确关系是什么如果是移植库(例如WTL就有多处这样情形)过程中遇到这种情况可以把实现体改为放到类定义体外如下:
SomeClass;
template Foo
{ public: void foo(SomeClass& a);
void foo2;
};
SomeClass
{
public: void some_func
{
...
}
};
template inline void Foo::foo(SomeClass& a)
{ a.some_func;
}
template inline void Foo::foo2
{ SomeClass a;
a.some_func;
}
最新评论