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

时间:2010-10-04 11:59:23

标签: 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;
}

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

6 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:3)

name<int>尝试访问name<double>的私人成员。你应该能够通过使转换函数成为朋友来修复它,但是我尝试了编译器go havoc if you try

您还可以让name<T>的任何name<U>朋友来解决此问题。

template <typename T>
class name
{
public:
    name() : h_(0){}

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

    template<typename U>
    friend class name; // <----

private:
    int h_;
};

答案 2 :(得分:2)

编译器将

name<T>name<U>视为两个不同的类,并且它不允许您访问其他类的私有成员。怎么解决?重新设计或授予友谊。或提供访问者......有很多方法可以做到,最合适的一个取决于你的意图。如果我猜错了你的意图,给予友谊可能是一个好主意,但我看不到你发布的代码的全貌。

答案 3 :(得分:1)

您需要添加setter / getters(或友谊或其他内容)。问题是name<T>name<U>是完全不相关的类。

或者,为什么不添加另一个构造函数name(const T &h) : h_(h) {}

答案 4 :(得分:0)

name<T>可能与name<U>不同[例如:在您的情况下]。因此,无法访问其他人的私人成员[如果TU是不同的类型]。

将以下内容添加到类定义中。

template<typename U>
 friend class name;

答案 5 :(得分:0)

Name<T>可能与Name<U>的类型不同,因此封装规则适用。使用访问者或朋友。