奇怪的 C++ 模板问题
Posted
技术标签:
【中文标题】奇怪的 C++ 模板问题【英文标题】:Weird C++ templating issues 【发布时间】:2009-08-23 23:33:46 【问题描述】:所以基本上任务是我们必须创建一个通用模板化的双向链表,而不是锁定到单一数据类型。我已经尝试使用 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;
非常感谢您对此事的任何帮助
【问题讨论】:
作为风格问题,寻求家庭作业帮助并没有错,但请不要说“我不明白!”并将所有代码转储给其他人。尝试发布尽可能少的代码来重现您的问题。 为清楚起见已编辑,对此感到抱歉 这很酷 - 每个人都会犯错。 您需要更多的代码。并非所有类型都已定义。 【参考方案1】:您的前向声明说 llist
是一个类:
class llist;
那你说它是一个模板:
template<typename T>
class llist;
与iter
类似。
我不知道如何使它易于编译。但是,您可以将node
和iter
设为llist
的“内部”。
【讨论】:
啊,废话,现在我看到了答案,这确实有道理。不敢相信我犯了这样的错误,谢谢。 通过“内部”,我相信他的意思是 llist 类的私有。我就是这样做的。 这是一个指向 SO 上其他地方非常相似的问题的链接。我在研究另一个问题时发现了这个问题(以及你的正确答案)。 ***.com/questions/1590688/… 我有类似的错误,因为我使用朋友喜欢朋友类 ComponentNode;并且 ComponentNode 是模板;/【参考方案2】:有几个问题。
class A;
不是你转发声明模板类的方式。
如果 A 有一个模板化参数,你需要说:
template<typename T>
class A;
如果你在你已经说过class A;
之后再这么说,那你就自相矛盾了。下一个问题是类似的,friend class A;
如果 A 模板化不起作用,你需要说friend class A<T>;
或类似的。最后,static_cast<int>(argv[1])
不会编译(虽然static_cast<int>(argv[1][0])
会,但仍然不是你想要的)。要将字符串有意义地转换为整数,您需要使用atoi
、strtol
、stringstream
等。
【讨论】:
感谢您对 atoi 的提醒,这是我准备解决的错误之一【参考方案3】:llist 不是一个类。所以向前声明它没有用。
template<typename T> class llist;
尝试让代码编译比较简单。 您刚刚错过了许多类型的模板部分。搜索 iter llist 和 node 并确保它们最后有适当的。
如果您查看 STL,通常会为一些内部类型进行 typedef 以方便使用。你可以遵循同样的原则。
template<typename T>
class llist
typedef iter<T> Iter;
typedef node<T> Node;
// The rest of the code.
;
【讨论】:
以上是关于奇怪的 C++ 模板问题的主要内容,如果未能解决你的问题,请参考以下文章