重载模板operator =用于两个模板:template< ...> A =模板< ...> B反之亦然

时间:2017-03-21 08:42:47

标签: c++ c++11 c++14

我正在实现两个模板类,其中任何一个类都应该有另一个类的赋值运算符:

// prototype of template B
template<uint32_t nQ> class B;

// template A
template<uint32_t nQ> class A
{
    public:
        A<nQ>& operator = ( const B<nQ>& b );
};

// template B
template<uint32_t nQ> class B
{
    public:
        B<nQ>& operator = ( const A<nQ>& a ) { ... }
};

// Operator = for class A
template<uint32_t nQ>
A<nQ>& A<nQ>::operator = ( const B<nQ> b ) { ... }
到目前为止,这么好。完美的工作。但是现在我想为nQ的不同值赋予赋值运算符。虽然在模板B中没有问题,但我无法使其适用于模板A:

// prototype of template B
template<uint32_t nQ> class B;

// template A
template<uint32_t nQ> class A
{
    public:
        A<nQ>& operator = ( const B<nQ>& b );
};

// template B
template<uint32_t nQ> class B
{
    public:
        B<nQ>& operator = ( const A<nQ>& a ) { ... }

        /*
         * I want to have this operator in template A as well
         */
        template<uint32_t otherQ>
        B<nQ>& operator = ( const A<otherQ>& ) { ... }
};

// Operator = for class A
template<uint32_t nQ>
A<nQ>& A<nQ>::operator = ( const B<nQ>& b ) { ... }

不幸的是,operator =无法实现为友元函数。我已经尝试了几乎所有的东西,但我没有完成它。 作为一个重要信息:我在自制的嵌入式硬件(STM32 + IAR Embedded Workbench)上使用C ++ 14编译器。 我非常感谢这里的帮助。

谢谢,蒂姆

1 个答案:

答案 0 :(得分:2)

以下应该有效:

// prototype of template B
template<uint32_t nQ> class B;

// template A
template<uint32_t nQ> class A
{
public:
    template <uint32_t OthernQ>
    A<nQ>& operator = ( const B<OthernQ>& b );
};

// template B
template<uint32_t nQ> class B
{
public:
    B<nQ>& operator = ( const A<nQ>& a ) { ... }

    template<uint32_t otherQ>
    B<nQ>& operator = ( const A<otherQ>& ) { ... }

};

// Operator = for class A
template <uint32_t nQ>
template <uint32_t OthernQ>
A<nQ>& A<nQ>::operator = ( const B<OthernQ>& b ) { ... }

类模板中方法模板的语法需要2 template