【问题标题】:Template friendship模板友谊
【发布时间】:2009-09-22 08:18:35
【问题描述】:

我正在尝试使用不同的模板参数访问模板类的受保护变量。带有模板参数的朋友声明给出以下错误:

不允许有多个模板参数列表

我的代码是

template<class O_, class P_> 
class MyClass {
    //multiple template parameter lists are not allowed
    template<class R_> friend class MyClass<R_, P_> 
    //syntax error: template<
    friend template<class R_> class MyClass<R_, P_> 

public:
    template<class R_>
    ACopyConstructor(MyClass<R_, P_> &myclass) :
       SomeVariable(myclass.SomeVariable)
    { }

protected:
    O_ SomeVariable;
};

如果我删除保护和朋友声明,它会起作用。

【问题讨论】:

  • MyClass 是它自己的朋友?!!
  • MyClass 与 MyClass 不是同一个类,因此它无法访问其受保护的变量。
  • AraK 没有 MyClass 这样的。
  • 朋友模板 class MyClass errrr R_ 在那里不知道作为开始恕我直言
  • 对不起,问题误解了:)

标签: c++ templates friend


【解决方案1】:

来自标准:14.5.3/9 [temp.friend],“友元模板不应被声明为部分特化。”,因此您只能“成为”类模板的所有实例化或特定的完整特化。

在您的情况下,由于您想成为具有一个免费模板参数的实例化的朋友,您需要将类模板声明为朋友。

例如

template< class A, class B > friend class MyClass;

【讨论】:

    【解决方案2】:

    以下似乎有效,有效地将所有 MyClass 类型声明为彼此为友。

    template<class O_, class P_> 
    class MyClass {
        template<class R_, class P_> friend class MyClass;
    
    public:
        template<class R_>
        ACopyConstructor(MyClass<R_, P_> &myclass) :
           SomeVariable(myclass.SomeVariable)
        { }
    
    protected:
        O_ SomeVariable;
    };
    

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2021-12-06
      • 1970-01-01
      • 2021-10-30
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多