为什么我得到错误c2512:没有适当的默认构造函数可用

Why I am getting error c2512 : no appropriate default constructor availiable?

本文关键字:默认 构造函数 错误 c2512 为什么      更新时间:2023-10-16

我正在尝试实现模板化类MyQueue(逻辑结构是环形缓冲区):

// MyQueue.h
#pragma once
template<typename T>
class MyQueue
{
public:
    /* interface */
    MyQueue(int sizeOfBuffer);
    void push(const T& elem);
    T pop(void);
private:
    T* m_array;
};
template<typename T>
MyQueue<T>::MyQueue(int sizeOfBuffer)
{
    m_array = new T[sizeOfBuffer];
}

通常当我在模板类中实现构造函数时,我在声明中实现它:

#pragma once
template<typename T>
class MyQueue
{
public:
    /* interface */
    MyQueue(int sizeOfBuffer){// do some actions with argument sizeOfBuffer};
    void push(const T& elem);
    T pop(void);
private:
    T* m_array;
};

由于构造函数的主体可能占用大量空间,我决定在声明之外实现它(但在同一个头文件中),以使代码更具可读性
问题:我做错了什么,如何解决我的问题?

这与你如何编写构造函数体无关。

它与这样一个事实有关:在某个地方,您显然试图创建该类的默认构造对象,但您没有提供默认构造函数。通常,编译器会合成一个默认构造函数,但由于您编写了一个带参数的构造函数,编译器也不会(自动)这么做。

使用最新的编译器,您应该能够使用c++ 11中引入的= default;语法合成默认构造函数。否则,您需要显式地编写一个,或者向现有的构造函数(例如,MyQueue(int sizeOfBuffer = 20);)添加默认参数。