在朋友班级中使用模板

时间:2018-10-04 04:18:52

标签: c++ templates friend

首先,我的老师要求我做类似的事情。

我有一类二维数组:

    #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

1 个答案:

答案 0 :(得分:0)

使用

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

友谊仅用于匹配T,我的意思是MyMaskedMassiv<int>可以使用My2dMassiv<int>的私人成员,而不能使用My2dMassiv<char>的私人成员。

你想要

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