我知道如果我不定义复制构造函数或构造函数,则c ++将其定义为auto 我知道Shallow&深拷贝 但是在下面的代码中我有一个关于复制构造函数的错误
#include<iostream>
#include <vector>
using namespace std;
template<class T>
class Stack
{
private:
vector<T> stack;
public:
vector<T> returnStack()
{
return stack;
}
vector<T> returnStack() const
{
return stack;
}
void Push(T item)
{
stack.insert(stack.begin()+stack.size(),item);
}
friend Stack operator+(const Stack &one,const Stack &other);
};
template<class T>
Stack<T> operator+(const Stack<T> &one,const Stack<T> &other)
{
Stack<T> newStack;
for (typename vector<T>::size_type i = 0; i < one.returnStack().size(); i++)
{
newStack.Push(one.returnStack()[i]);
}
for (typename vector<T>::size_type i = 0; i < other.returnStack().size(); i++)
{
newStack.Push(other.returnStack()[i]);
}
return newStack;
}
int main()
{
Stack <int > a;
Stack <int > b;
a.Push(1);
a.Push(2);
b.Push(3);
b.Push(4);
Stack <int> c=a+b ;//have a bug
return 0;
}
以上代码重新发布以下错误
undefined reference to operator+(Stack<int> const&, Stack<int> const&)'
我花了很多时间来调试它,但我累了。你能帮助我吗?
答案 0 :(得分:2)
朋友声明很奇怪,甚至在模板中也很陌生。
这解决了它:
// forward declarations required
template<class T>
class Stack;
template<class T>
Stack<T> operator+(const Stack<T> &one,const Stack<T> &other);
template<class T>
class Stack
{
private:
vector<T> stack;
public:
vector<T> returnStack()
{
return stack;
}
vector<T> returnStack() const
{
return stack;
}
void Push(T item)
{
stack.insert(stack.begin()+stack.size(),item);
}
friend Stack operator+<>(const Stack &one,const Stack &other);
// ^^ brackets required
};
template<class T>
Stack<T> operator+(const Stack<T> &one,const Stack<T> &other)
{
Stack<T> newStack;
return newStack;
}
说实话,我不确定为什么这是必需的,但是嘿,它有效。
或者,您可以在课堂中定义友元函数:
template<class T>
class Stack
{
private:
vector<T> stack;
public:
vector<T> returnStack()
{
return stack;
}
vector<T> returnStack() const
{
return stack;
}
void Push(T item)
{
stack.insert(stack.begin()+stack.size(),item);
}
friend Stack operator+(const Stack &one,const Stack &other) {
return Stack();
}
};
答案 1 :(得分:1)
简短回答。将朋友声明更改为
friend Stack operator+<>(const Stack &one,const Stack &other);
完整的解释在这里 - http://www.parashift.com/c++-faq/template-friends.html