所以基本上我们必须创建一个双向链接列表,这个列表一般是模板化的,而不是锁定到单个数据类型。我尝试使用gcc和msvc进行编译,两个编译器都给出了大致相同的错误,所以我假设它只是我的编码错误,而不是一个编译器或另一个编译器的怪异。
目前,我收到的错误是我的linkList.h
中的课程不是模板
../ linkList.h:34:错误:'llist'不是模板类型
../linkList.h:143:错误:'iter'不是模板类型
../josephus.cpp:14:错误:'llist'不是模板
../josephus.cpp:14:错误:聚合'llist ppl'的类型不完整 并且无法定义
../josephus.cpp:15:错误:'iter'不是 模板
linkList.h
template<typename T>
class iter
{
public:
iter()
{
position = sentin;
container = sentin->payload;
}
T get() const
{
assert(position != sentin);
return position->payload;
}
void next()
{
position = position->next;
}
void previous()
{
position = position->prev;
}
bool equals(iter itr) const
{
return position == itr.position;
}
private:
node *position;
llist *container;
};
josephus.cpp
llist<int> ppl;
iter<int> pos;
int start = static_cast<int>(argv[1]) - 1;
int end = static_cast<int>(argv[2]) - 1;
非常感谢任何有关此事的帮助
答案 0 :(得分:11)
您的前瞻性声明称llist
是一个类:
class llist;
然后你说这是一个模板:
template<typename T>
class llist;
与iter
类似。
我不知道你怎么能轻易编辑它。不过,您可以在node
内设iter
和llist
。
答案 1 :(得分:2)
llist不是一个类。所以前面声明它没用。
template<typename T> class llist;
尝试编译代码相对简单 你刚刚错过了很多类型的模板部分。搜索它的llist和节点,并确保它们在最后有适当的。
如果你看一下STL,那么为了方便使用,可以输入一些内部类型。你可以遵循同样的原则。
template<typename T>
class llist
{
typedef iter<T> Iter;
typedef node<T> Node;
// The rest of the code.
};
答案 2 :(得分:2)
有几个问题。
class A;
不是你转发声明模板化类的方式。
如果A有一个模板化参数,您需要说:
template<typename T>
class A;
如果你说过class A;
之后就说你自相矛盾了。下一个问题是simlar,friend class A;
如果A模板不起作用,则需要说friend class A<T>;
或类似。最后,static_cast<int>(argv[1])
将无法编译(虽然static_cast<int>(argv[1][0])
会,但仍然不希望你想要)。要将字符串有意义地转换为整数,您需要使用atoi
,strtol
,stringstream
等。