代码之家  ›  专栏  ›  技术社区  ›  Naveen

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

  •  2
  • Naveen  · 技术社区  · 14 年前

    我想写一篇 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 回复  |  直到 14 年前
        1
  •  3
  •   sbi    14 年前

    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;
    };
    
        2
  •  3
  •   Johannes Schaub - litb    14 年前

    您可以将转换函数声明为friend

    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
  •  0
  •   Puppy    14 年前

    你可以建造 A<U> 直接使用int。