【问题标题】:Using Template in friend class [duplicate]在朋友类中使用模板[重复]
【发布时间】:2018-10-04 04:18:51
【问题描述】:

首先,我的老师要求我做这样的事情。

我有一类二维数组:

    #pragma once
    #include <iostream>
    #include "MyMaskedMassiv.h"

    template<typename T>
    class MyMaskedMassiv;

    template <typename T>
    class My2dMassiv{
    private:
        T* mas;
        int col;
        int str;
    public:
    ........
        friend class MyMaskedMassiv<T>;

        MyMaskedMassiv<T>& operator()(My2dMassiv<bool>& mask){
            MyMaskedMassiv<T> *maskMas = new MyMaskedMassiv<T>();
            maskMas->masiv = this;
            maskMas->mask = &mask; 
            return *maskMas;
        }
    }

你可以看到另一个类“MyMaskedMassiv”有指向第一个类的链接:

    #pragma once
    #include "My2dMassiv.h"

    template <typename U>
    class My2dMassiv;

    template <typename T>
    class MyMaskedMassiv{
    private:
        My2dMassiv<T> *masiv;
        My2dMassiv<bool> *mask;
    public:
        friend class My2dMassiv<T>;
        friend class My2dMassiv<bool>;

        MyMaskedMassiv(){
            masiv = nullptr;
            mask = nullptr;
        }

        MyMaskedMassiv& operator=(const T& el){
            int s = masiv->str;
            int c = masiv->col;

            for(int i=0; i<c; i++)
                for( int j=0; j<s; j++)
                    if( this->mask->mas[i*s + j] == true)
                        this->masiv->mas[i*s + j] = el;  

        return *this;
        }
    }

然后我尝试构建我得到一个错误:

    My2dMassiv.h:11:8: error: ‘bool* My2dMassiv<bool>::mas’ is private

    ../src/myproject/MyMaskedMassiv.h:27:36: error: within this context
             if( this->mask->mas[i*s + j] == true)

那么..我做错了什么?

如果您想查看完整代码,请在此处查看:GIT

【问题讨论】:

  • My2dMassiv&lt;bool&gt; 将被实例化为T=bool,这意味着friend class MyMaskedMassiv&lt;T&gt;; 将变为friend class MyMaskedMassiv&lt;bool&gt;;,这只有在MyMaskedMassiv&lt;T&gt; 专门围绕T = 时才有用bool.

标签: c++ templates friend


【解决方案1】:

template <typename T>
class My2dMassiv{
    friend class MyMaskedMassiv<T>;
    // ...
};

友谊只用于匹配T,我的意思是MyMaskedMassiv&lt;int&gt;可以使用My2dMassiv&lt;int&gt;的私人成员,但不能使用My2dMassiv&lt;char&gt;的私人成员。

你想要

template <typename T>
class My2dMassiv{
    template <typename U>
    friend class MyMaskedMassiv;
    // ...
};

【讨论】:

  • 谢谢!似乎我只是在以另一种方式考虑朋友声明 XD。
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2011-10-14
  • 1970-01-01
  • 2010-10-06
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多