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

Error C2512 No appropriate default constructor even though I have one?

本文关键字:构造函数 有一个 默认 C2512 错误      更新时间:2023-10-16

通过向符号结构添加默认构造函数来解决问题,但我也想问,如果可能的话,为什么会调用默认构造函数。如果没有,那也没关系。谢谢

我正试图写一个树,但当我定义一个节点时,如下所示:

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

默认构造函数用于初始化对象,而不使用参数。要解决此问题,只需输入:

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

在您的结构、类和任何其他结构中,如果它们是在没有参数的情况下声明的。

如果你想听到更多关于"默认构造函数"的概念。


有相当多的stackoverflow问题与错误:C2512有关
考虑一下:错误C2512:没有合适的默认构造函数可用


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

  • "当对象数组被声明时,例如MyClass x[10];;或被动态分配时,例如新的MyClass[10];默认构造函数用于初始化所有元素"

  • "当对象值在没有参数列表的情况下声明时,例如MyClass x;;或在没有参数表的情况下动态分配时,例如new MyClass或new MyClass();默认构造函数用于初始化对象"

  • "当派生类构造函数没有显式调用其初始值设定项列表中的基类构造函数时,基类的默认构造函数被调用"

最后一个对继承很重要。