繁体   English   中英

奇怪的C ++模板问题

[英]Weird C++ templating issues

因此,基本上我们必须创建一个双重链接列表,这个列表一般是模板化的,而不是锁定到单个数据类型。 我已经尝试使用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;

对此事的任何帮助都非常感谢

你的前瞻声明说llist是一个类:

class llist;

然后你说它是一个模板:

template<typename T>
class llist;

iter类似。

我不知道你怎么能让它容易编译。 但是,您可以在llist创建nodeiter

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

有几个问题。

class A;

不是你转发声明模板类的方式。

如果A有一个模板化参数,您需要说:

template<typename T>
class A;

如果你说过你已经说过class A;之后的话class A; 你自相矛盾。 下一个问题是simlar, friend class A; 如果A模板不起作用,你需要说friend class A<T>; 或类似的。 最后, static_cast<int>(argv[1])将不会编译(虽然static_cast<int>(argv[1][0])会,但仍然不想要你想要)。 要将字符串有意义地转换为整数,您需要使用atoistrtolstringstream等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM