(使用此关键字需要 /clr:oldSyntax 命令行选项)各位C++高手,请帮帮帮小弟!!错在哪里,怎样改,为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(使用此关键字需要 /clr:oldSyntax 命令行选项)各位C++高手,请帮帮帮小弟!!错在哪里,怎样改,为啥?相关的知识,希望对你有一定的参考价值。

程序:
// circle.cpp: 主项目文件。

#include "stdafx.h"
#using <mscorlib.dll>
#include<tchar.h>
using namespace System;
__value struct Point

public:
float x;
float y;
Point()

x=0;
y=0;

Point(float i,float j)

x=i;
y=j;

;
__value struct Circle

public:
Point a;
float r;
void setradius(float i)

r=i;

float getradius()

return r;

double square()

return 3.14*r*r;

;
int main(array<System::String ^> ^args)

//Console::WriteLine(L"Hello World");
Point q(1,1);
Circle c;
c.a=q;
c.setradius(1);
Console::Write(S"Center:(");
Console::Write(c.a.x);
Console::Write(S",");
Console::Write(c.a.y);
Console::Write(S")");
Console::Write(S"Square:");
Console::WriteLine(c.square());
return 0;

调试错误提示:
(7) : error C4980: “__value”: 使用此关键字需要 /clr:oldSyntax 命令行选项
1>.\circle.cpp(12) : error C3417: “Point::Point(void)”: 值类型不能包含用户定义的特殊成员函数
1>.\circle.cpp(48) : error C3921: 使用带有 S 前缀的字符串需要 /clr:oldSyntax 命令行选项
1> 当使用 /clr 进行编译时,存在从字符串类型到 System::String^ 的隐式转换。如果有必要避免二义性,请转换为 System::String^
1>.\circle.cpp(50) : error C3921: 使用带有 S 前缀的字符串需要 /clr:oldSyntax 命令行选项
1> 当使用 /clr 进行编译时,存在从字符串类型到 System::String^ 的隐式转换。如果有必要避免二义性,请转换为 System::String^
1>.\circle.cpp(52) : error C3921: 使用带有 S 前缀的字符串需要 /clr:oldSyntax 命令行选项
1> 当使用 /clr 进行编译时,存在从字符串类型到 System::String^ 的隐式转换。如果有必要避免二义性,请转换为 System::String^
1>.\circle.cpp(53) : error C3921: 使用带有 S 前缀的字符串需要 /clr:oldSyntax 命令行选项
1> 当使用 /clr 进行编译时,存在从字符串类型到 System::String^ 的隐式转换。如果有必要避免二义性,请转换为 System::String^
1>生成日志保存在“file://d:\c++\circle\circle\Debug\BuildLog.htm”
1>circle - 6 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
不好意思,分不多了,只能给30分,请前辈帮晚辈一把,谢过了!!

参考技术A http://msdn2.microsoft.com/zh-cn/library/k8d11d4s(VS.80).aspx

带有此关键字的 requestAnimationFrame

【中文标题】带有此关键字的 requestAnimationFrame【英文标题】:requestAnimationFrame with this keyword 【发布时间】:2011-08-29 05:46:10 【问题描述】:

我正在使用webkitRequestAnimationFrame,但在对象内部使用它时遇到问题。如果我传递了 this 关键字,它将使用 window 并且我找不到它使用指定对象的方法。

例子:

Display.prototype.draw = function()
  this.cxt.clearRect(0, 0, this.canvas.width, this.canvas.height);
  //Animation stuff here.

  window.webkitRequestAnimationFrame(this.draw);
;

我也试过了,但没用:

Display.prototype.draw = function()
  this.cxt.clearRect(0, 0, this.canvas.width, this.canvas.height);
  //Animation stuff here.

  var draw = this.draw;
  window.webkitRequestAnimationFrame(draw);
;

【问题讨论】:

【参考方案1】:

我正在尝试传递 webkitRequestAnimationFram 所在的函数 display.draw。

webkitRequestAnimationFrame 大概会调用你传入的函数,如下所示:

function webkitRequestAnimationFrame(callback)

    // stuff...
    callback();
    // other stuff...

此时,您已将draw 函数与其调用上下文分离(分离)。您需要将函数 (draw) 绑定到其上下文(Display 的实例)。

你可以使用Function.bind,但是这个requires JavaScript 1.8 support(或者只使用推荐的补丁)。

Display.prototype.draw = function()

    // snip...

    window.webkitRequestAnimationFrame(this.draw.bind(this));
;

【讨论】:

我正在尝试传递 display.draw,这是 webkitRequestAnimationFram 所在的函数。 哦,我想我看到了问题:你可以传递函数,但是webkitRequestAnimationFrame 稍后会调用它,this 不会指向正确的对象,因为你已经“分离”了来自其对象的函数。查看我的编辑(待定)。 bind 方法工作得很好(从不知道,thnx :])但是通过闭包传递this.draw(); 仍然会引发错误。 Uncaught TypeError: Object [object DOMWindow] has no method 'draw' 嗯,还是不行Uncaught TypeError: Object #&lt;Display&gt; has no method 'fn'不过不用担心,bind方法已经足够好了。感谢您的帮助。 我不知道 Function.bind 方法。我想象中的帽子送给你! :)【参考方案2】:

这个怎么样:

Display.prototype.draw = function()
  this.cxt.clearRect(0, 0, this.canvas.width, this.canvas.height);
  //Animation stuff here.

  window.webkitRequestAnimationFrame( $.proxy(function() this.draw(), this) );
;

...假设您使用 jquery

【讨论】:

如何在没有jquery的情况下使用它??我尝试使用绑定,但它给出的最大堆栈大小超出了错误。【参考方案3】:

您不必使用“this”。 保持简单。

var game = 
      canvas:null,
      context:null,

    init:function()
            // init canvas, context, etc
    ,      

    update:function()
        //do something
        game.render();                        
        requestAnimationFrame(game.update, game.canvas);        
    ,            
;

【讨论】:

不错。我需要一个可以从类外部访问的方法,所以我使用了这个成语:var update = this.update = function() render(); requestAnimationFrame(update); 【参考方案4】:

您可能还想使用 requestAnimationFrame shim 使其适用于所有浏览器 https://github.com/kof/animation-frame

【讨论】:

【参考方案5】:

我不能保证这是一个好主意并且我是对的,但是在每个 requestAnimationFrame 上运行 .bind 意味着在每次迭代中创建一个新函数。对我来说听起来不太对劲。

这就是为什么在我的项目中我缓存了绑定函数以避免反模式。

简单示例:

var Game = function () 
    this.counter = 0;
    this.loop = function () 
        console.log(this.counter++); 
        requestAnimationFrame(this.loop);
    .bind(this);
    this.loop();

var gameOne = new Game();

如果您有一个具有原型继承的更复杂的项目,您仍然可以创建一个缓存函数,并将“this”绑定在对象的构造函数中

var Game = function () 
    this.counter = 0;
    this.loopBound = this.loop.bind(this);
    this.loopBound();

Game.prototype.loop = function () 
    console.log(this.counter++); 
    requestAnimationFrame(this.loopBound);

var gameOne = new Game();

想法? http://jsfiddle.net/3t9pboe8/(查看控制台)

【讨论】:

我修改了您的fiddle 以(我认为)测试缓存绑定函数与不缓存之间的区别。我很惊讶地看到两者之间的性能几乎相同(在 Firefox 47、Chrome 52 和 IE 11 中)。看起来好像bind 创建的函数被浏览器缓存了,但我不知道实际发生了什么。我什至尝试单独运行每个程序以避免浏览器优化requestAnimationFrame 的干扰。 @SeanH 在这种情况下,“循环”是一个非常简单的函数,由一个计数器递增和一个条件检查组成。我想知道在更复杂的函数的每次迭代中使用“绑定”是否会产生更大的差异。在从不超过 60fps 的 requestAnimationFrame 上进行这种做法的好处可能是微不足道的。【参考方案6】:

现在 ES6/2015 已经发布,如果您使用的是转译器,那么箭头函数将具有词法 this 绑定,因此可以代替:

window.webkitRequestAnimationFrame(this.draw.bind(this));

你可以这样做:

window.webkitRequestAnimationFrame(() => this.draw());

这有点干净。

我已经有效地将 Typescript 转换为 ES5。

【讨论】:

这是我现在使用的。 我刚刚使用了这种技术,我不得不在箭头函数中放置一个参数,对应于 rAF() 回调接收的 timeStamp 参数:(t) =&gt; this.draw(t)【参考方案7】:

除了bind 方法和箭头函数解决方案(由 Jamaes World 的回答提供)之外,另一个(相当老的)解决方法可能是:

var self = this
window.webkitRequestAnimationFrame(
    function() 
        self.draw()
    
);

【讨论】:

以上是关于(使用此关键字需要 /clr:oldSyntax 命令行选项)各位C++高手,请帮帮帮小弟!!错在哪里,怎样改,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中分配此关键字

如何在 MS Access 中相交?

如何将关键事件发送到 QWebElement?

Pandas DataFrame筛选包含某个关键词的行/列

linux非root用户如何永久获取/dev/pts/1的权限

软件技巧(10)---- Notepad++/Source insight 使用技巧