gpt4 book ai didi

C++ 模板 : Coding error or compiler bug?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:27 25 4
gpt4 key购买 nike

我正在尝试使用模板获取项目的 std:list,其中每个项目都有一个指向包含它的列表的指针,但我一直遇到编译器消息。

这是一个非常精简的代码版本。

template <class E> class Item  
{
public:
E* owner; // pointer to list that owns us.
};

template <class E> class BaseList: public std::list<E>
{
protected:
typedef std::list<E> inherited;
public:

void push_back(const E &e)
{
E tmp(e);
tmp.owner = this; // This line gives the error.
inherited::push_back(tmp);
}
};

class MyList;

class MyItem : public Item<MyList>
{
};

class MyList : public BaseList<MyItem>
{
};

void foo() // test code to instantiate template
{
MyList l;
MyItem m;
l.push_back(m);
}

但是,我的编译器在该行 barfs:-

        tmp.owner = this;  

错误是:

[BCC32 Error] Unit7.cpp(30): E2034 Cannot convert 'BaseList<MyItem> * const' to 'MyList *'

好像“this”不知何故变成了常量,但我不明白为什么。编译器是 Codegear C++Builder 2009。

我承认我不是 100% 喜欢使用模板,所以我不确定这是我的问题还是编译器的问题。不使用模板的相同代码可以很好地编译,但显然这不是我想要的,因为我有几个项目/列表类想要以这种方式工作。

此外,是否有更好的技术可以避免在每个项目中拥有所有“所有者”指针?

编辑: 我想我把这个例子简化得太过分了:“MyList”实际上引入了新方法,“MyItem”必须通过“owner”指针访问这些方法。

总结:感谢所有评论和回答。正如公认的答案所说,问题只是指向 BaseList 与 MyList 的指针之间的类型不兼容之一。

提出的有关从 STL 容器派生和替代设计的问题也很有帮助,但我使用的解决方案与下面 Luc Touraille 的解决方案基本相同。

最佳答案

在第 30 行,“this”是一个指向 BaseList<MyIteM> 的指针,不是我的列表。您可以用派生类替换类,但反过来不行。

您可以将 MyList 类型定义为 BaseList<MyItem> ,像这样:

typedef BaseList<MyItem> MyList

或者让 MyItem 派生自 Item<BaseList<MyItem> >相反。

当您从一个类型派生时,您创建了一个不同的类型。当您使用 typedef 时,您为该类型创建了一个别名。所以当你 typedef 编译器会接受它。

关于C++ 模板 : Coding error or compiler bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/915172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com