【问题标题】:How to use structs, typedef, and template?如何使用结构体、类型定义和模板?
【发布时间】:2020-11-09 17:50:16
【问题描述】:

我正在尝试实现以下代码,但由于typedef,我一直收到错误消息,有人可以帮忙吗?

 template<class T>
 struct box{
 T data;
 box *link;
 };
 typedef box* boxPtr;

错误是:

Use of class template 'box' requires template arguments

【问题讨论】:

  • 请同时添加错误信息。
  • 这是一个简短的 sn-p,但这里仍有很多内容需要解压。通过选择并阅读其中一本书here,您可能会得到更好的服务。
  • 一个标题的答案可以填满一本书的好几章。请尝试更具体。你到底想达到什么目的?错误是什么?
  • 好的,现在,您不明白错误消息的哪一部分? box 是模板,不是类型
  • @harry 只是不要将 boxPtr 定义为一种类型。你不需要它。问题解决了。

标签: c++ templates typedef


【解决方案1】:

box 是一个类模板。这意味着无论何时实例化它都需要一个参数:

box<int>   integerBox;
box<float> floatBox;
// etc

在您尝试使用模板类(例如box)的任何地方都需要这样做。因此,仅指向 box 的指针没有意义。它需要一个类型。例如:

template <class type>
using boxptr = box<type>*;

这实际上与您的 typedef 做同样的事情,但它允许您指定底层模板类型。

当然,如果你这样做,你在使用指针版本时总是需要指定一个类型:

boxptr<int>   integerBoxPtr;
boxptr<float> floatBoxPtr;
// etc

【讨论】:

  • @harry 不客气。请注意,在本网站上,感谢某人的最佳方式是投票赞成他们的答案和/或接受它。除非绝对必要,否则我们一般会尽量避免在本网站上使用 cmets。谢谢 cmets 通常不被认为是绝对必要的 - 我们通常更希望您投票并接受最佳答案。
【解决方案2】:

写作

template<class T>
struct box{
    T data;
    box *link;
 
    typedef box<T>* boxPtr; 
};

int main()
{
    box<int>::boxPtr use_of_a_bad_idea;
}

是一种方法,但是将指针类型伪装成对象类型会导致内存泄漏:根据经验不要这样做。 这是解决这个问题的最好方法。

【讨论】:

  • “指针类型伪装成指针类型” - 啊……嗯……
  • 不久前,我误读了一个问题,并把它写成了按值传递的小事,因为询问者使用 typedef 来隐藏类型 一个指针。如果我没有多次通读代码,我也很容易给出糟糕的建议。 boxPtr 中的 Ptr 使得指针数量级比其他丢失的问题更明显,但对于任何大脑习惯于寻找 * 的人来说,仍然不如 box * 明显。
  • @StoryTeller-UnslanderMonica:今天有一个送货,需要一台挖掘机在我曾经原始的草坪上翻滚很多次。它现在看起来像一个MOD训练场。确实压力很大。因此,一两个奇怪的错误逐渐出现。
【解决方案3】:

使用using:

template<class T>
struct box
{
    T data;
    box *link;
};

template <typename T>
using boxPtr = box<T>*;

现在boxPtr&lt;int&gt;box&lt;int&gt;* 相同。

【讨论】:

    【解决方案4】:

    这将编译:

    template<class T>
    struct Box {
        T data;
        Box<T> *link;
    };
    
    typedef Box<int> * BoxPTR;
    

    【讨论】:

    • 我建议您突出显示或澄清您的代码和 OP 之间的区别。
    • 请记住,编译通常只是开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多