Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板和在类构造函数中使用(#define)_C++_Class_Templates_Constructor_Default Arguments - Fatal编程技术网

C++ 模板和在类构造函数中使用(#define)

C++ 模板和在类构造函数中使用(#define),c++,class,templates,constructor,default-arguments,C++,Class,Templates,Constructor,Default Arguments,我已经实现了堆栈过程。这个程序应该和真正的堆栈内存一样工作。此外,我正在尝试使用模板,使程序更通用。我在使用#define DEFAULT_SIZE 10作为类构造函数的参数时遇到了一个问题 首先,当我在构造函数的原型中放入DEFAULT\u SIZE时,它运行得很顺利: #define DEFAULT_SIZE 10 template<typename T> class stack { public: stack(int size=DEFAULT_SIZE); privat

我已经实现了堆栈过程。这个程序应该和真正的堆栈内存一样工作。此外,我正在尝试使用模板,使程序更通用。我在使用
#define DEFAULT_SIZE 10
作为类构造函数的参数时遇到了一个问题

首先,当我在构造函数的原型中放入
DEFAULT\u SIZE
时,它运行得很顺利:

#define DEFAULT_SIZE 10

template<typename T>
class stack {
public:
   stack(int size=DEFAULT_SIZE);
private:
   T *elements;
   int size;
   int count;
};

template<typename T>
stack<T>::stack(int s) {
   cout << "--constructor called\n";
   size = s;
   elements = new T[size];
   count = 0;
}
最后,该计划的主要内容:

int main() {
   stack<int> u;
   u.push(4);
}
intmain(){
堆栈u;
u、 推(4);
}

我的问题不是关于“为什么模板只能在头文件中实现?”我的问题是我使用
默认大小的地方,我想,问题只是模板声明的不同:

 stack(int size);
和模板定义:

stack<T>::stack(int s=DEFAULT_SIZE) {
   ...
}
stack::stack(int s=默认大小){
...
}

默认值必须在声明部分,并且如果定义中的方法签名与声明不同(您在定义中添加了默认大小),编译器不确定您是否编写了相同的构造函数。注意,
DEFAULT\u SIZE
s
值未指定给构造函数时应用,所以您的定义将作为默认构造函数使用,但声明是带有一个参数的构造函数

我想,问题在于模板声明的不同:

 stack(int size);
和模板定义:

stack<T>::stack(int s=DEFAULT_SIZE) {
   ...
}
stack::stack(int s=默认大小){
...
}

默认值必须在声明部分,并且如果定义中的方法签名与声明不同(您在定义中添加了默认大小),编译器不确定您是否编写了相同的构造函数。注意,
DEFAULT\u SIZE
s
值未指定给构造函数时应用,所以您的定义将作为默认构造函数使用,但声明是带有一个参数的构造函数

例如,如果您使用Ideone编译第二个代码段,它将为您提供“stack::stack(int)”的“重新声明”可能没有默认参数(请参阅)

prog.cpp:16:35:错误:“stack::stack(int)”的重新声明可能没有默认参数[-fpermissive]
堆栈::堆栈(int s=默认大小){
必须在第一次声明中指定默认参数

如果您声明自己的构造函数,默认构造函数将被删除。但是,只要所有参数都有默认值,您的构造函数将充当默认构造函数


第一部分为构造函数参数声明了正确的默认值。第二部分没有,编译器也没有机会将构造函数用作默认构造函数。

例如,如果使用Ideone编译第二个代码段,它将为您提供“stack::stack(int)”的“重新声明“可能没有默认参数”(请参阅)

prog.cpp:16:35:错误:“stack::stack(int)”的重新声明可能没有默认参数[-fpermissive]
堆栈::堆栈(int s=默认大小){
必须在第一次声明中指定默认参数

如果您声明自己的构造函数,默认构造函数将被删除。但是,只要所有参数都有默认值,您的构造函数将充当默认构造函数


您的第一部分声明了构造函数参数的正确默认值。第二部分没有,编译器没有机会将构造函数用作默认构造函数。

< P>在C++规范(Po.83.6PT 4)中提到,

对于非模板函数,可以在同一范围内函数的后续声明中添加默认参数

因此,您不能在定义中指定默认值。这就是第二种方法不起作用的原因


虽然第一种方法将是一种期望的行为,但是您可以省略定义中的缺省值。

< P>在C++规范(Po.83.6PT 4)中提到,

对于非模板函数,可以在同一范围内函数的后续声明中添加默认参数

因此,您不能在定义中指定默认值。这就是第二种方法不起作用的原因



第一种方法可以工作,因为它是一种理想的行为,您可以忽略定义中的默认值。

请使用代码标题修复您的代码块。非常感谢您的提醒。问题清楚吗???您从哪里获得“没有合适的默认构造函数可用”此代码中的错误?我在我写的行(stack u;)中得到了错误。基本上,将实现放在头文件中,而不是创建单独的实现文件。请使用代码标题修复代码块。非常感谢您的提醒。问题清楚吗???您从何处获得此代码这段代码中“没有合适的默认构造函数可用”错误?我在写的行中得到了错误(堆栈u;)基本上,将实现放在头文件中,而不是创建一个单独的实现文件。你真是太好了。我明白了。你真是太好了。我明白了。我在我写的行中得到了错误(stack u;)我补充了我的答案来解释发生了什么。非常感谢。我已经寻找答案多年。嗨,Kasra。如果这个或任何答案已经解决了你的问题,请考虑通过点击复选标记接受它。这向更广泛的社区表明,你已经找到了解决方案,并给回答者和你自己带来了一些声誉。re没有义务这样做。(从Ben处盗取的注释)注意:此规则仅适用于模板。非模板函数可能在重新声明中添加了默认参数。我在写入的行(堆栈u;)中得到错误我补充了我的答案来解释发生了什么。非常感谢。我已经寻找答案多年。嗨,Kasra。如果这个或任何答案已经解决了你的问题,请考虑通过点击复选标记接受它。这表明更广泛的合作。