0

好的,我有点坚持尝试为我的模板类重载 << 运算符。要求是 << 运算符必须调用为此类定义的 void 打印函数。

以下是模板标题中的重要内容:

template <class T>
class MyTemp {
public:
    MyTemp();           //constructor

    friend std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a);

    void print(std::ostream& os, char ofc = ' ') const;

这是我的打印功能,基本上它是一个向量并将最后一个元素打印到第一个:

    template <class T>
void Stack<T>::print(std::ostream& os, char ofc = ' ') const
{
    for ( int i = (fixstack.size()-1); i >= 0 ; --i)
    {
        os << fixstack[i] << ofc;
    }
}

这就是我如何让 operator<< 重载:

    template <class T>
std::ostream& operator<< (std::ostream& os, const Stack<T>& a)
{
    // So here I need to call the a.print() function
}

但我收到“未解析的外部符号”错误。所以真的我想我有两个问题。首先,是解决上述错误的方法。其次,一旦解决了这个问题,我会在 << 重载中调用 a.print(os) 吗?我知道它需要返回一个 ostream。任何帮助将不胜感激!

4

3 回答 3

2

最简单的做法是print公开(如您的示例中所示),因此操作员不需要成为朋友。

template <class T>
class MyTemp {
public:
    void print(std::ostream& os, char ofc = ' ') const;
};

template <class T>
std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a) {
    a.print(os);
    return os;
}

如果您确实需要它是私有的,那么您需要将正确的模板特化声明为友元——您的friend声明在周围的命名空间中声明了一个非模板运算符,而不是一个模板。不幸的是,要使模板成为朋友,您需要事先声明它:

// Declare the templates first
template <class T> class MyTemp;
template <class T> std::ostream& operator<< (std::ostream&, const MyTemp<T>&);

template <class T>
class MyTemp {
public:
    friend std::ostream& operator<< <>(std::ostream& os, const MyTemp<T>& a);
    // With a template thingy here  ^^

private:
    void print(std::ostream& os, char ofc = ' ') const;
};

template <class T>
std::ostream& operator<< (std::ostream& os, const MyTemp<T>& a) {
    a.print(os);
    return os;
}

或者您可以定义内联运算符:

template <class T>
class MyTemp {
public:
    friend std::ostream& operator<<(std::ostream& os, const MyTemp<T>& a) {
        a.print(os);
        return os;
    }

private:
    void print(std::ostream& os, char ofc = ' ') const;
};

对于你的最后一个问题:

其次,一旦解决了这个问题,我会a.print(os)<<重载中调用吗?我知道它需要返回一个ostream

它确实需要返回一个ostream- 所以只需返回传入的那个,就像在我的示例代码中一样。

于 2012-02-23T07:34:54.550 回答
1

此错误意味着链接器无法识别一个符号。关于您收到此错误的变量是什么,还请检查堆栈,因为有一个可用的 std::stack 类。

于 2012-02-23T07:32:44.860 回答
0

由于您的print成员函数是公开的,因此无需声明operator<<friend.

请注意,您使用的 classStack是您的重载,以及MyTemp以上...

于 2012-02-23T07:30:25.497 回答