不同模板实例化同一模板之间的转换

时间:2010-06-04 12:15:51

标签: c++ templates type-conversion

我正在尝试编写一个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>完全不同。除了提供setter和getter方法之外,有没有简单的解决方法(可能是使用朋友?)?如果重要的话,我正在使用Visual Studio 2008。

3 个答案:

答案 0 :(得分:3)

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;
};

答案 1 :(得分:3)

您可以将转化功能声明为朋友

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;
};

答案 2 :(得分:0)

您可以直接使用int构建A<U>