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。如果这个或任何答案已经解决了你的问题,请考虑通过点击复选标记接受它。这表明更广泛的合作。