奇怪的C++模板问题

5
基本上这个任务是要我们创建一个模板化的双向链表,而不是单一数据类型。我已经尝试使用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'不是a 模板
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;

任何关于这个问题的帮助都非常感激。

作为一种风格,寻求作业帮助并没有什么问题,但请不要说“我不明白!”并将所有代码倾泻在他人身上。尽量发布尽可能少的代码以重现您的问题。 - Chris Lutz
抱歉,由于清晰度的原因进行了编辑。 - user161741
很酷 - 每个人都会犯错。 - Chris Lutz
你需要更多的代码。并没有定义所有的类型。 - Martin York
3个回答

12

你的前置声明表明 llist 是一个类:

class llist;

然后你说它是一个模板:

template<typename T>
class llist;
同样地,使用 iter 也是如此。
我不知道怎样才能使它容易地编译。然而,你可以将 nodeiter 嵌套在 llist 中。

啊,糟糕了,现在看到答案我才明白。真不敢相信我会犯这样的错误,谢谢。 - user161741
通过“inside”,我相信他的意思是私有于llist类。这就是我会这样做的方式。 - jkeys
这是一个链接,指向SO上的一个非常相似的问题。当我在研究其他问题时,我发现了这个问题(以及你正确的答案)。 https://dev59.com/vnI-5IYBdhLWcg3w99kH - razlebe
我有类似的错误,因为我使用了 friend 类似这样的语句:friend class ComponentNode; 而 ComponentNode 是一个模板。/ - Gelldur

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.
    };
    

    2

    有几个问题需要解决。

    class A;
    

    这不是声明模板类的正确方式。

    如果 A 有一个模板参数,你需要这样写:

    template<typename T>
    class A;
    

    如果你在已经声明了 class A; 之后再说相反的话,那就是自相矛盾了。下一个问题类似,如果 A 是模板类,则 friend class A; 将无法工作,需要使用 friend class A<T>; 或类似的语法。最后,static_cast<int>(argv[1]) 将无法编译(尽管 static_cast<int>(argv[1][0]) 可以,但这仍然不是你想要的)。要有意义地将字符串转换为整数,你需要使用 atoistrtolstringstream 等函数。

    谢谢你提醒我关于atoi的问题,这是我准备解决的错误之一。 - user161741

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接