有没有办法添加一个友元类,它本身是但具有不同的模板参数?

问题描述 投票:0回答:1

我正在用 C++ 编写一个与 numpy 等效的可变维度数组。我使用模板类在数组中存储不同类型的数据类型。

最终,我不得不编写数据类型转换的代码。我想让数组将其数据类型更改为另一种数据类型,因此我编写了一个用于转换的构造函数。但是,该类必须访问该类的私有值,但具有不同的模板参数。

以下是一个最小的示例:

template <typename T>
class my_class
{
private:
    T value;
    
public:
    // Constructor to initialize the data
    my_class(T value) : value(value) {}

    // Constructor for the conversion
    template<typename O>
    my_class(my_class<O> another)
    {
        value = static_cast<T>(another.value);   // Cast the type to T
    }
};

但是,当我尝试运行以下测试代码时:

int main()
{
    // Create an integer class
    my_class<int> a = 3;

    // Convert it to float
    my_class<float> b = a;

    return 0;
}

MSVC 发出此错误:

error C2248: 'my_class<int>::value': cannot access private member declared in class 'my_class<int>'

我尝试通过以下方式将朋友添加到个人

my_class
es:

template <typename T>
class my_class
{
    // ...

public:
    template <typename U>
    friend class my_class<U>;
    
    // ...
}

但是发生了这个错误:

friend class my_class<U>;
             ^~~~~~~~~^
error C3772: 'my_class<U>': invalid friend template declaration

有没有办法添加一个友元类,它本身是但具有不同的模板参数? 或者,如果这是不可能的,是否有办法访问类本身的私有方法/值,但使用不同的模板参数?

但是,我更喜欢朋友方法,因为它允许我只添加朋友一次并稍后访问私有方法/值。

c++ templates private friend
1个回答
0
投票

你想要这个:

template <typename U>
friend class my_class;
© www.soinside.com 2019 - 2024. All rights reserved.