我正在尝试编写一个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。
答案 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>
。