【问题标题】:Error - "expression must have a class type" - c++ [duplicate]错误-“表达式必须具有类类型”-c ++ [重复]
【发布时间】:2017-10-08 13:18:08
【问题描述】:

我有自己的 LinkedList 类,当我在主目录中创建实例时,我收到“表达式必须具有类类型”错误。 我在 LinkedList 类中有一个默认的 c'tor。

所以当我尝试这样做时:

    LinkedList<Animal> aL();

    for (int i = 0; i < numOfAnimals; i++)
    {

        aL.addLast(*animals[i]);
    }

    cout << aL << endl;

它不会编译。 但如果我这样声明:

    LinkedList<Animal> aL = LinkedList<Animal>();

它有效。 当然,第二个选项效率不高,我宁愿使用第一个。 谁能解释我为什么它不起作用或如何解决它? 谢谢!

【问题讨论】:

  • 这是“最令人头疼的解析”的一个实例
  • LinkedList&lt;Animal&gt; aL(); -- 这是一个函数声明。仔细看看。
  • @VittorioRomeo 据我所知,“最令人头疼的解析”这个词指的是这个更复杂的变体,比如A a(B());
  • @lisyarus - 考虑到这不是一个官方术语,而是一个口语,我不明白为什么不扩展它。如果一个人不习惯,这一切都非常令人烦恼。
  • @lisyarus - 没问题。口语经常变化,并且随着使用而变化。

标签: c++


【解决方案1】:

线

LinkedList<Animal> aL();

不是创建LinkedList&lt;Animal&gt; 的实例,而是声明一个没有参数的函数aL,并将LinkedList&lt;Animal&gt; 作为其返回类型。

要使用默认构造函数创建对象,请不要使用任何大括号:

LinkedList<Animal> aL;

或者,如果您希望如此明确,可以使用 C++11 中的花括号

LinkedList<Animal> aL{};

或者,如果你非常喜欢函数调用语法,你可以

LinkedList<Animal> aL = LinkedList<Animal>();

甚至

auto aL = LinkedList<Animal>();

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多