Преобразование между различными экземплярами шаблона одного и того же шаблона - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь написать operator, который конвертирует между разными типами одной и той же реализации. Это пример кода:

template <class T = int>
class A
{
public:
    A() : m_a(0){}

    template <class U>
    operator A<U>()
    {
        A<U> u;
        u.m_a = m_a; 
        return u;
    }
private:
    int m_a;
};

 int main(void)
{
    A<int> a;
    A<double> b = a;
    return 0;
}

Однако для строки u.m_a = m_a; это выдает следующую ошибку.

Ошибка 2, ошибка C2248: «A :: m_a»: не может получить доступ к объявленному приватному члену в классе 'A' d: \ VC ++ \ Vs8Console \ Vs8Console \ Vs8Console.cpp 30 Vs8Console

Я понимаю, что ошибка в том, что A<U> совершенно другого типа, чем A<T>. Есть ли какой-нибудь простой способ решить эту проблему (возможно, с помощью друга?), Кроме предоставления методов установки и получения? Я использую Visual studio 2008, если это имеет значение.

Ответы [ 3 ]

3 голосов
/ 05 июня 2010

Вы можете объявить функцию преобразования в друзья

template <class T = int>
class A
{
public:
    A() : m_a(0){}

    template <class U>
    operator A<U>()
    {
        A<U> u;
        u.m_a = m_a; 
        return u;
    }

    template <class U> template<class V>
    friend A<U>::operator A<V>();
private:
    int m_a;
};
3 голосов
/ 04 июня 2010

VC10 принимает это:

template <class T = int>
class A
{
public:
    template< typename U>
    friend class A;

    A() : m_a(0){}

    template <class U>
    operator A<U>()
    {
        A<U> u;
        u.m_a = m_a; 
        return u;
    }
private:
    int m_a;
};
0 голосов
/ 05 июня 2010

Вы можете создать A<U> напрямую с помощью int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...