操作在MANAGED C ++项目中重载C ++

时间:2011-04-28 14:12:37

标签: c++ visual-c++ operator-overloading

我是一个托管的C ++ DLL,它与C#GUI进行通信。它工作正常,通信通过一个包装器,这一切都有效。 dll中的代码都是用C ++编写的,但我不能让运算符重载工作,我计划用它来排序向量。我不知道我的代码中是否存在错误,或者它是否无效,因为它位于托管C ++项目中。

我已经尝试了排序(它,它),但它不起作用,因为运算符重载不起作用。我也试过使用比较排序(它,它,less_than_second),这也不起作用,因为我得到错误。我尝试了很多东西,我得到的错误如下: - 排序只需要2个参数 - less_than_second_未声明的标识符

运算符重载不会产生错误。

这是移动类的代码,我想重载运算符<:

public class Move
{

public:
    friend bool operator < (const Move &firstMove, const Move &secondMove)
    {
        return (firstMove.score < secondMove.score);
    }
    bool operator<(const Move& b) {
     return this->score < b.score;
    }
    int positionFrom;
    int positionTo;
    int tileFrom;
    int score;
    bool isJumpMove;
    Move(void);
    Move(int to);
    Move(int from, int to, bool isJumpMove);
    Move(int from, int to, int tileFrom, bool isJumpMove);


};

Testcode in a function of another class.

Move* move1 = new Move();
        move1->score = 2;
        Move* move2 = new Move();
        move2->score = 1;
        Move* move3 = new Move();
        move3->score = 0;
        Move* move4 = new Move();
        move4->score = 4;

        if(move1 < move2)
        {
            Console::WriteLine("2 is bigger than 1");
        }
        else
        {
            Console::WriteLine("1 is bigger than  2");
        }

        vector<Move*> vectorList;
        vectorList.push_back(move1);
        vectorList.push_back(move2);
        vectorList.push_back(move3);
        vectorList.push_back(move4);

        for (int i=0; i<vectorList.size(); i++) {
         Console::WriteLine(vectorList[i]->score);
        }
        sort (vectorList.begin(), vectorList.end() );
        sort (vectorList.begin(), vectorList.end(), less_than_second);
        for (int i=0; i<vectorList.size(); i++) {
         Console::WriteLine(vectorList[i]->score);
        }
the compare function ( it's in the cpp file of another class )

inline bool less_than_second( Move &move1,Move &move2){
        return (move1.score < move2.score);
    }

4 个答案:

答案 0 :(得分:2)

您的向量元素是Move*(指针)。这是一个内置类型,您无法重新定义其运算符。 less_than_second签名错误,不接受指针。

答案 1 :(得分:1)

我很确定你需要在你的类之外定义你的布尔运算符,比较两个对象不是类的隐式部分,它是被比较的对象的外部。

答案 2 :(得分:0)

我认为你混淆了使用单词重载的两种不同方式。运算符重载意味着提供对用户类型进行操作的机制,就像它是语言基元类型一样。函数重载意味着您​​有两个或多个具有相同名称但不同参数的函数。对于每个运算符都是c ++,你必须匹配一个spesfic定义,而你可以定义派生类型的参数重载的倍数,它将包含相同数量的参数。

答案 3 :(得分:0)

我记得C#中的.NET的逻辑和算术运算符重载需要你使用 reflection.emit在中级语言级别。您可以测试Type.IsPrimitive。

公共代表TResult BinaryOperator

      TResult>(TLeft left, TRight right);



/// <summary>

/// See Stepanov and McJones BinaryOperator

/// </summary>

/// <typeparam name="TLeft"></typeparam>

/// <typeparam name="TRight"></typeparam>

/// <typeparam name="TResult"></typeparam>

/// <typeparam name="TOwner"></typeparam>

static class GenericOperatorFactory<TLeft, TRight, TResult, TOwner>

{

    private static BinaryOperator<TLeft, TRight, TResult> add;

    private static BinaryOperator<TLeft, TRight, TResult> sub;

    private static BinaryOperator<TLeft, TRight, TResult> mul;

    private static BinaryOperator<TLeft, TRight, TResult> div;



    public static BinaryOperator<TLeft, TRight, TResult> Add

    {

        get

        {

            if (add == null)

            {

                // For debugging

                Console.WriteLine("Creating Add delegate for:\nTLeft = {0}\n" +

                "TRight = {1}\nTResult = {2}\nTOwner = {3}", 

                typeof(TLeft), typeof(TRight), typeof(TResult), typeof(TOwner));



                DynamicMethod method = new DynamicMethod(

                    "op_Addition:" + typeof(TLeft).ToString() + ":" + typeof(TRight).ToString() + ":" + typeof(TResult).ToString() + ":" + typeof(TOwner).ToString(),

                    typeof(TLeft),

                    new Type[] { typeof(TLeft), typeof(TRight) },

                    typeof(TOwner)

                );



                ILGenerator generator = method.GetILGenerator();



                generator.Emit(OpCodes.Ldarg_0);

                generator.Emit(OpCodes.Ldarg_1);



                if (typeof(TLeft).IsPrimitive)

                {

                    Console.WriteLine("Adding primitives");

                    generator.Emit(OpCodes.Add);

                }

                else

                {

                    Console.WriteLine("Adding non-primitives");

                    MethodInfo info = typeof(TLeft).GetMethod(

                        "op_Addition",

                        new Type[] { typeof(TLeft), typeof(TRight) },

                        null

                    );



                    generator.EmitCall(OpCodes.Call, info, null);

                }



                generator.Emit(OpCodes.Ret);



                Console.WriteLine("Method name = " + method.Name);



                add = (BinaryOperator<TLeft, TRight, TResult>)method.CreateDelegate(typeof(BinaryOperator<TLeft, TRight, TResult>));

            }



            return add;

        }   

    }

互联网上还有其他一些例子