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

时间:2013-12-03 05:41:44

标签: c++ constructor tree

解决方法是在符号struct中添加一个默认构造函数,但我想问一下为什么在可能的情况下调用默认构造函数。如果没有,那很好。感谢。

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

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

};

1 个答案:

答案 0 :(得分:0)

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

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

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

如果您想更多地了解"Default Constructors"的概念。


有很多与错误:C2512 相关的stackoverflow问题 考虑一下这个: error C2512: no appropriate default constructor available


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

  • 当声明一个对象数组时,例如MyClass x [10] ;;或动态分配,例如new MyClass [10];默认构造函数用于初始化所有元素”< p>

  • 当声明一个没有参数列表的对象值时,例如MyClass x ;;或动态分配,不带参数列表,例如new MyClass或new MyClass();默认构造函数用于初始化对象< / EM>“

  • 当派生类构造函数未在其初始化列表中显式调用基类构造函数时,基类的默认构造函数称为

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