【问题标题】:C++, templates with parameters, redefined operator = and pointers assignmentC++、带参数的模板、重新定义的运算符 = 和指针赋值
【发布时间】:2012-07-30 17:59:41
【问题描述】:

有一个类Test:

typedef enum
{
    AA, BB
} TType;

template <typename T>
struct TVector
{
    typedef std::vector <T> Type;
};

template < typename T, const TType type >
class Test
{
private:
            typename TVector <T>::Type it; 
};

及其重新定义运算符 = 的特化(没有附加功能):

template < typename T, const TType type >
class Test <T *, type> 
{
public:
    Test <T *, type > & operator = ( const Test <T*, type > &source ) {return *this;}

            template <TType type2>
    Test <T *, type > & operator = ( const Test <T*, type2 > &source ){return *this;}

            template <TType type2>
    Test <T *, type > * operator = ( const Test <T*, type2 > *source ) {return *this;}
};

我正在尝试将具有不同 TType 参数的对象相互分配,并且此步骤可以正常工作。

int _tmain(int argc, _TCHAR* argv[])
{
Test <double *, AA> a1;
Test <double *, BB> b1;

a1=b1;  //Correct

Test <double *, AA> *a2;
Test <double *, BB> *b2;

a2 = b2;  //Error

return 0;
}

但是用指针同步不行,看错误码:

Error   1   error C2440: '=' : cannot convert from 'Test<T,type> *' to 'Test<T,type> *' 49

是否可以相互分配具有不同 TType 参数的指针(如何?)?

更新问题:

那么指针和对象之间的赋值呢?

a2 = &b1;  //Error
*a2 = b1;  //Unitialized memory

我可以索要代码示例吗? 感谢您的帮助。

【问题讨论】:

    标签: c++ templates pointers assignment-operator


    【解决方案1】:

    第二个示例不起作用,因为您没有将分配给对象,而是将分配给指针。这不起作用的原因相同:

    int * a;
    float * b;
    
    b = a;
    

    即使float 可以从int 分配,指向float 的指针不能从int 的指针分配。

    改用*a2 = b2 或*a2 = *b2 - 您的运营商应该同时抓住这两个。

    还要注意,这个实现似乎是错误的:

    template <TType type2>
    Test <T *, type > * operator = ( const Test <T*, type2 > *source )
    {
        return *this;
    }
    

    this 隐式变量已经是指针类型,所以你需要return this,而不是return *this。我建议完全消除赋值运算符的这种重载,因为它肯定会比它有用的更令人困惑。

    【讨论】:

    • 感谢您的回答...但是如果向量包含大量数据,*a2 = *b2 可能会很耗时。这就是我只想传递指针的原因......
    • @justik 但是如果你直接分配给a2,你就是分配给一个指针。如果您使用引用,*a2 = *b2 将同样高效;使用指针而不是引用不会运行得更快。打字可能会快一点,但这是唯一的好处。此外,将一个指针分配给另一个导致实际对象分配的指针会让经验丰富的 C++ 开发人员感到困惑,他们会期望它只是复制指针。
    • @Mr.Anubis 我不知道你在问什么,也不知道它与手头的问题有什么关系。
    • @cdhowie 抱歉,我没有正确查看示例,我想这就是为什么问了奇怪的问题
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2021-05-13
    • 2020-08-17
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多