奇怪的 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类似。

我不知道如何使它易于编译。但是,您可以将nodeiter 设为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&lt;T&gt;; 或类似的。最后,static_cast&lt;int&gt;(argv[1]) 不会编译(虽然static_cast&lt;int&gt;(argv[1][0]) 会,但仍然不是你想要的)。要将字符串有意义地转换为整数,您需要使用atoistrtolstringstream 等。

【讨论】:

感谢您对 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++ 模板问题的主要内容,如果未能解决你的问题,请参考以下文章

C++模板类的继承

奇怪的 C++ 新运算符用法 [重复]

c++ CString Tokenize 奇怪的问题

对象创建引起的 C++ 奇怪的分段错误

默认构造函数的奇怪错误(C++)

什么是奇怪的重复模板模式(CRTP)?