Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates D语言中结构的运算符重载 我试图在D语言中实现像C++(代码)>代码> >代码> >代码> >代码> *>代码>代码> >代码>(只是想得到一个从C++迁移到D的想法,我通常做3D图形和数值数学)。但我可能遗漏了一些东西,下面的代码不起作用(我试着根据包含的引用来做)_Templates_Struct_Operator Overloading_D - Fatal编程技术网

Templates D语言中结构的运算符重载 我试图在D语言中实现像C++(代码)>代码> >代码> >代码> >代码> *>代码>代码> >代码>(只是想得到一个从C++迁移到D的想法,我通常做3D图形和数值数学)。但我可能遗漏了一些东西,下面的代码不起作用(我试着根据包含的引用来做)

Templates D语言中结构的运算符重载 我试图在D语言中实现像C++(代码)>代码> >代码> >代码> >代码> *>代码>代码> >代码>(只是想得到一个从C++迁移到D的想法,我通常做3D图形和数值数学)。但我可能遗漏了一些东西,下面的代码不起作用(我试着根据包含的引用来做),templates,struct,operator-overloading,d,Templates,Struct,Operator Overloading,D,opBinary实现似乎编译得很好,但我在尝试使用它时总是出错: ./operator_overload.d(27): Error: incompatible types for ((a) + (b)): 'vec3f' and 'vec3f' Failed: ["dmd", "-v", "-o-", "./operator_overload.d", "-I."] 编辑:我还尝试了根据。同样的错误 struct vec3f{ float x,y,z; } vec3f opBinary(stri

opBinary
实现似乎编译得很好,但我在尝试使用它时总是出错:

./operator_overload.d(27): Error: incompatible types for ((a) + (b)): 'vec3f' and 'vec3f'
Failed: ["dmd", "-v", "-o-", "./operator_overload.d", "-I."]
编辑:我还尝试了根据。同样的错误

struct vec3f{ float x,y,z; }
vec3f opBinary(string op)(vec3f a,vec3f b)if(op=="+"||op=="-"||op=="*"||op=="/"){
     mixin("return vec3f(a.x"~op~"b.x,a.y"~op~"b.y,a.z"~op~"b.z);");
}
编辑2:是的,它必须是struct body的一部分(我不知道是否有任何方法可以使它独立运行)。这非常有效:

#!/usr/bin/env rdmd
import std.stdio;

struct vec3(T){ 
    float x,y,z; 
    vec3!T opBinary(string op)(vec3!T b) if(op=="+"||op=="-"||op=="*"||op=="/"){ 
        mixin("return vec3!T(x"~op~"b.x,y"~op~"b.y,z"~op~"b.z);"); 
    }
}

void main(){
    auto a = vec3!float(1.1,2.2,3.2);
    auto b = vec3!float(3.1,2.2,1.2);
    writeln(a); writeln(b);
    writeln( a+b );
    writeln( a*b );
}

< C++和D之间的主要区别之一是D中的用户指定运算符总是操作数之一的成员。对于二进制运算符,如果结构是左侧,则该运算符称为
opBinary
,对于右侧,它称为
opBinaryRight
。这不是别的方法,原因很充分:它使实现操作符重载变得非常复杂。您可能知道C++在搜索操作符重载时忽略命名空间,例如“代码> >我不确定,但重载操作符是否需要成为相应结构的成员?试着把它移到结构(相关的编辑,OFC)中。一个小的修正:C++在查找函数时不忽略命名空间。它使用依赖于参数的查找,尝试在其参数的名称空间中解析函数。它不需要在函数中为运算符注释名称空间。但是,是的,依赖于参数的查找在D中不是一件事。它也不太可能成为未来的功能。
#!/usr/bin/env rdmd
import std.stdio;

struct vec3(T){ 
    float x,y,z; 
    vec3!T opBinary(string op)(vec3!T b) if(op=="+"||op=="-"||op=="*"||op=="/"){ 
        mixin("return vec3!T(x"~op~"b.x,y"~op~"b.y,z"~op~"b.z);"); 
    }
}

void main(){
    auto a = vec3!float(1.1,2.2,3.2);
    auto b = vec3!float(3.1,2.2,1.2);
    writeln(a); writeln(b);
    writeln( a+b );
    writeln( a*b );
}