错误:未定义对operator +的引用(Stack <int> const&amp;,Stack <int> const&amp;)&#39; </int> </int>

时间:2013-04-11 08:13:09

标签: c++

我知道如果我不定义复制构造函数或构造函数,则c ++将其定义为auto 我知道Shallow&amp;深拷贝 但是在下面的代码中我有一个关于复制构造函数的错误

#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&)'

我花了很多时间来调试它,但我累了。你能帮助我吗?

2 个答案:

答案 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