Eu estava escrevendo uma matriz de dimensão variável equivalente numpy em C++. Usei uma classe de modelo para armazenar diferentes tipos de tipos de dados no array.
Eventualmente, tive que escrever um código para a conversão do tipo de dados. Eu gostaria que os arrays mudassem seus tipos de dados para outros, então escrevi um construtor para a conversão. No entanto, a classe teve que acessar os valores privados da classe, mas com argumentos de modelo diferentes.
O seguinte é um exemplo mínimo:
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
}
};
No entanto, quando tento executar o seguinte código de teste:
int main()
{
// Create an integer class
my_class<int> a = 3;
// Convert it to float
my_class<float> b = a;
return 0;
}
MSVC emite este erro:
error C2248: 'my_class<int>::value': cannot access private member declared in class 'my_class<int>'
Tentei adicionar um amigo aos my_class
itens individuais seguindo:
template <typename T>
class my_class
{
// ...
public:
template <typename U>
friend class my_class<U>;
// ...
}
No entanto, este erro ocorreu:
friend class my_class<U>;
^~~~~~~~~^
error C3772: 'my_class<U>': invalid friend template declaration
Existe uma maneira de adicionar uma classe amiga que seja ela mesma, mas com argumentos de modelo diferentes? Alternativamente, se isso não for possível, existe uma maneira de acessar os métodos/valores privados de uma classe em si, mas com argumentos de modelo diferentes?
No entanto, eu preferiria a abordagem de amigo, pois permite adicionar o amigo apenas uma vez e acessar os métodos/valores privados posteriormente.
Você quer isso: