gpt4 book ai didi

c++ - 我遇到了复制构造函数错误,但不知道我对这个错误的想法是否正确

转载 作者:行者123 更新时间:2023-11-28 00:10:16 25 4
gpt4 key购买 nike

我正在编写一个名为 StackGuard 的类 unique_ptr 类,并尝试创建两个复制构造函数:

template<typename T>    
class StackGuard{
T* thePtr; //To store the raw pointer.
//something here...
StackGuard(StackGuard<T>& newPtr) throw();
StackGuard(StackGuard<T> newPtr) throw(); //I know this is not the right way
//something here...
};

template<typename T>
StackGuard<T>::StackGuard(StackGuard<T>& newPtr) throw(){
thePtr = newPtr.thePtr;
newPtr.thePtr = NULL;
}

template<typename T>
StackGuard<T>::StackGuard(StackGuard<T> newPtr) throw(){
thePtr = newPtr.thePtr;
newPtr.thePtr = NULL;
}

但它不起作用。编译器说

error: invalid constructor; you probably meant ‘StackGuard<T> (const StackGuard<T>&)’
StackGuard(StackGuard<T> newPtr) throw();
^
error: prototype for ‘StackGuard<T>::StackGuard(StackGuard<T>)’
does not match any in class ‘StackGuard<T>’
StackGuard<T>::StackGuard(StackGuard<T> newPtr) throw(){
^
error: candidates are: StackGuard<T>::StackGuard(const StackGuard<T>&)
StackGuard<T>::StackGuard(const StackGuard<T>& newPtr) throw(){
^
error: StackGuard<T>::StackGuard(T*)
StackGuard<T>::StackGuard(T* guarded = NULL) throw() {

我想到了这个错误,但不知道对不对。

我的想法是:

传值复制构造函数需要使用复制构造函数来复制参数,在这种情况下,它会递归调用自身,从而导致无限调用。

我也想知道,为什么编译器会给出“不匹配任何类中的”错误,因为它有一个匹配项。

最佳答案

来自[class.copy]:

A declaration of a constructor for a class X is ill-formed if its first parameter is of type (optionally cv-qualified) X and either there are no other parameters or else all other parameters have default arguments. A member function template is never instantiated to produce such a constructor signature.

你的构造函数 StackGuard(StackGuard<T> )是病式的。这里的问题与递归无关:这样的构造函数会导致歧义。考虑等价物:

void foo(int ) { }
void foo(int& ) { }

int i;
foo(i); // error: ambiguous

如果允许这样的构造函数,那么在这个冒名顶替的复制构造函数和真正的(隐式或显式)复制构造函数之间总会存在歧义。

此外,“unique-ptr like”不建议我复制。您需要编写一个移动构造函数。如果你无法访问 C++11,你会想看看如何 auto_ptr已实现并从那里复制。

关于c++ - 我遇到了复制构造函数错误,但不知道我对这个错误的想法是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com