加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

基本类型的C模板继承问题

发布时间:2020-12-16 10:17:36 所属栏目:百科 来源:网络整理
导读:我有以下代码,它无法编译 template typename T class Base{public: typedef T * TPtr; void func() { }};template typename T class Derived : public Base T {public: using Base T ::TPtr; using Base T ::func; TPtr ptr;};int main( int c,char *v[] ){
我有以下代码,它无法编译

template < typename T >
class Base
{
public:

    typedef T * TPtr;

    void func()
    {
    }
};

template < typename T >
class Derived : public Base< T >
{
public:
    using Base< T >::TPtr;
    using Base< T >::func;

    TPtr ptr;
};

int main( int c,char *v[] )
{
    Derived< int > d;
    d.func();
}

编译器发出以下内容.

t.cpp:16: error: 'TPtr' does not name a type
t.cpp:16: note: (perhaps 'typename Base<T>::TPtr' was intended)

现在我知道我可以简单地按照编译器的建议去做但我无法理解为什么

using Base< T >::TPtr;

不起作用.

如果我注释掉“TPtr ptr”行,那么它会编译,证明“使用Base< T> :: func;”声明有效.

有任何想法吗?

解决方法

基< T> :: TPtr是一个所谓的依赖名称,因此您需要在其前面添加typename以使声明有效.

此外,使用不能与typename一起使用,因此您需要使用typedef:

typedef typename Base<T>::TPtr TPtr;

问题是编译器无法决定 – 不知道T是什么! – 此上下文中的TPtr是否指定类型或变量/函数.为了避免含糊不清,它总是假设后者,除非另有明确说明(因此需要typename).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读