none
类模板中友元函数声明 RRS feed

  • 问题

  • template <typename T>

    class MyClass

    {

       template <typaname T>

       friend ostream& operator<< (ostream&, const MyClass<T>&);   //这样声明对吗?

       public:

          ....

       private:

           ...

    };


    2011年5月26日 6:23

答案

  • 你好,

     

    根据您的代码,您所定义的是操作符,所以应该没有返回值。您可以这样定义友元操作符

    friend std::ostream& operator << <T> (std::ostream& os, const Number<T>& n);

    如果您需要定义友元函数,你可以如下定义:

    template <typename T> friend void function <T>(const Number<T>& n);

     

    此外您还需要注意的是,在申明友元函数后,您可以直接在模板中定义函数。如果您想在类模板外定义,请注意当模板函数被声明为类模板的友元时,在函数名之后必须紧跟模板实参表,用来代表该友元声明指向函数模板的实例。否则友元函数会被解释为一个非模板函数,链接时无法解析。

     

    希望我的回答能够帮助您解决您的问题。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月30日 8:30

全部回复

  • 你好,

     

    根据您的代码,您所定义的是操作符,所以应该没有返回值。您可以这样定义友元操作符

    friend std::ostream& operator << <T> (std::ostream& os, const Number<T>& n);

    如果您需要定义友元函数,你可以如下定义:

    template <typename T> friend void function <T>(const Number<T>& n);

     

    此外您还需要注意的是,在申明友元函数后,您可以直接在模板中定义函数。如果您想在类模板外定义,请注意当模板函数被声明为类模板的友元时,在函数名之后必须紧跟模板实参表,用来代表该友元声明指向函数模板的实例。否则友元函数会被解释为一个非模板函数,链接时无法解析。

     

    希望我的回答能够帮助您解决您的问题。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月30日 8:30
  • 谢谢!

    是用友元函数重载 流插入运算符(<<)


    2011年6月1日 8:47