我是一个托管的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);
}
答案 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;
}
}
互联网上还有其他一些例子