错误 C2512 没有合适的默认构造函数,即使我有一个?

Posted

技术标签:

【中文标题】错误 C2512 没有合适的默认构造函数,即使我有一个?【英文标题】:Error C2512 No appropriate default constructor even though I have one? 【发布时间】:2013-12-03 05:41:44 【问题描述】:

通过在符号结构中添加一个默认构造函数来解决,但我也想问一下,如果可能的话,为什么要调用一个默认构造函数。如果没有,那很好。谢谢。

我正在尝试写一棵树,但是当我像这样定义一个节点时:

TreeNode<SymbolPriority>* treeRoot =
    new TreeNode<SymbolPriority>(SymbolPriority('a', 1));

我无法编译,它会抛出一个Error c2512 'SymbolPriority': no default appropriate default constructor;但是,在我的结构中,我有我正在尝试使用的构造函数,并且我以前使用过它,所以我不知道发生了什么。

我试过这个:

SymbolPriority aSymbol( 'a', 1 );

TreeNode<SymbolPriority>* treeRoot = new TreeNode<SymbolPriority> (aSymbol);

但它也不起作用。

我把相关代码写在下面:

template<typename DATA_TYPE> struct TreeNode

TreeNode(const DATA_TYPE& value, TreeNode* left = NULL, TreeNode* right = NULL)

  Value = value;
  Left = left;
  Right = right;


DATA_TYPE Value;
TreeNode* Left;
TreeNode* Right;

bool IsLeaf() const

  return Left == NULL && Right == NULL;


;

struct SymbolPriority

   SymbolPriority(char aSymbol, int priority)
       Symbol = aSymbol;
       Priority = priority;
   ;

   char Symbol;
   int Priority;

   bool operator > (const SymbolPriority& compareTo) const
        return (Priority > compareTo.Priority );
   ;

   bool operator < (const SymbolPriority& compareTo) const
    return !( *this > compareTo);
   ;

   bool operator==(const SymbolPriority& compareTo) const
        return (Priority == compareTo.Priority );
   ;

;

【问题讨论】:

这些类都没有默认构造函数。另外,您的operator&lt; 实际上是operator&lt;= TreeNode* treeRoot = new TreeNode(SymbolPriority('a', 1 ) );试试这个 【参考方案1】:

默认构造函数用于在不使用参数的情况下初始化对象。 要解决这个问题,简单地说:

TreeNode()  // NO PARAMETERS
    ... // default initializing variables, or whatever you'd like

在您的结构、类和任何其他内容中,如果它们被声明为不带参数。

如果您想了解更多关于 "Default Constructors" 概念的信息。


有很多关于 Error: C2512 的 *** 问题。 考虑看看这个: error C2512: no appropriate default constructor available


Wikipedia 恰好对默认构造函数 here 的必要性给出了很好的解释。 一些值得注意的目的是:

"当声明对象数组时,例如 MyClass x[10];;或动态分配时,例如 new MyClass [10];默认构造函数用于初始化所有元素" "当一个对象值声明时没有参数列表,例如 MyClass x;;或者动态分配没有参数列表,例如 new MyClass 或 new MyClass();默认构造函数用于初始化对象"

"当派生类构造函数没有显式调用其初始化列表中的基类构造函数时,会调用基类的默认构造函数"

最后一个对于继承很重要。

【讨论】:

我考虑过,但是在实例化之外构造符号也不起作用(我用的那个词对吗)? @user1375469 您一定尝试过在没有任何构造函数类型参数的情况下初始化您的对象。不要忘记类型参数。 好的,我已经为符号结构添加了默认构造函数,现在它可以工作了,但是我很困惑为什么需要调用默认构造函数? @user1375469 编译器需要知道如何初始化你的结构,以防不提供参数。否则它的值(如果我错了,请纠正我)可能会给出“未知结果”。

以上是关于错误 C2512 没有合适的默认构造函数,即使我有一个?的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2512:没有合适的默认构造函数可用(不是类)

错误 C2512 但我有可用的默认构造函数

error C2512: 没有合适的默认构造函数可用

复制构造函数没有合适的默认构造函数

错误 C2512:没有适当的默认构造函数可用 - 为啥在构造函数中初始化属性?

使用模板时缺少默认构造函数