【问题标题】:Friend function from a templated class来自模板类的朋友函数
【发布时间】:2013-07-30 18:11:18
【问题描述】:

我有这样的课:

#include "Blarg.h"
// ...

class Foo : public Bar {    
  // ...
  static double m_value;
  // ...    
}; 

还有一个是这样的:

template<class X, class Y>
class Blarg : public Bar {
  // ...
  void SetValue(double _val) { Foo::m_value = _val; }
  // ...
};

由于Foom_value 是私有的(我想保持这种状态),我想我会将SetValue 函数声明为Foo 类的朋友,以便它可以访问需要时静态成员。

我已经尝试在Foo 的公共区域内按照这些方式声明:

template<class X, class Y> friend void Blarg<X, Y>::SetValue(double _val);

template<class X, class Y> friend void Blarg::SetValue(double _val);

friend void Blarg::SetValue(double _val);

...但是编译没有运气。如果可能的话,正确的语法是什么?

【问题讨论】:

  • 第一个有什么错误?
  • “编译失败”不是对您所面临错误的技术描述。
  • 每个类定义后需要写;

标签: c++ class templates friend


【解决方案1】:

您必须在Foo 类之前定义Blarg 类,以便将Blarg 的方法之一标记为friend。确定Blarg 是在Foo 声明之前定义(或包含)的吗?

【讨论】:

  • 修复成员函数的类型(缺少返回类型)。 +1
  • ^哎呀!感谢您接听!
【解决方案2】:

这似乎对我有用:

template<class X, class Y>
class Blarg : public Bar {
    public:
        void SetValue(double _val);
};

class Foo : public Bar {
    private:
        static double m_value;

    public:
        template<class X, class Y> friend void Blarg<X,Y>::SetValue(double _val);
};

template <class X, class Y>
void Blarg<X,Y>::SetValue(double _val)
{
    Foo::m_value = _val;
}

我必须通过首先定义 Blarg 并使 SetValue 不是内联来打破循环依赖。除了缺少返回值之外,您的朋友声明几乎是正确的。

【讨论】:

    【解决方案3】:

    下面是正确的语法:

    template<class T>
    class Bla
    {
     public:
      void toto(double val);
    };    
    
    class Foo {
      static double m_value;
      template<typename T>
      friend void Bla<T>::toto (double);
    } ;
    

    另外,请确保 BlaFoo 之前定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多