在实例化模板时,无法访问类错误中声明的私有成员

rah*_*arg 6 c++ templates

我的代码如下

template <typename T>

class name
{
public:
    name() : h_(0){}

    template <typename U>
    operator name<U>()
    {
        name<U> u;
        u.h_ = h_;
        return u;
    }
private:
    int h_;
};

int main(void)
{
    name<int> a;
    name<double> b = a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是int name<double>::h_ is private.如何修复错误?

ken*_*ytm 7

name<int>并且name<double>是不同的实例,因此实际上是不同的类.默认情况下,他们的私人成员无法共享.你需要和name<T>其他name人交朋友.

template <typename T>

class name
{
public:
    name() : h_(0){}

    template <typename U>
    operator name<U>()
    {
        name<U> u;
        u.h_ = h_;
        return u;
    }
private:
    int h_;
    template <typename>   // <--
    friend class name;   // <--
};

int main(void)
{
    name<int> a;
    name<double> b = a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


AnT*_*AnT 2

name<T>并被name<U>编译器视为两个不同的类,并且它不允许您访问另一个类的私有成员。如何修复它?要么重新设计,要么给予友谊。或者提供访问器...有很多方法可以做到这一点,最合适的一种取决于您的意图。如果我猜对了你的意图,授予友谊可能是一个好主意,但我无法从你发布的代码中看到全貌。