我正在将一些Java代码移植到C#,我遇到了这个用于复制对象的习惯用法:
class Base
{
int x;
public Base(int x) { this.x = x; }
protected Base(Base other) { x = other.x; }
}
class Derived : Base
{
Base foo;
public Derived(Derived other)
: base(other)
{
foo = new Base(other.foo); // Error CS1540
}
}
Run Code Online (Sandbox Code Playgroud)
错误CS1540是:
无法通过类型为"Base"的限定符访问受保护成员'Base.Base(Base)'; 限定符必须是'Derived'类型(或从中派生)
我理解这个错误的目的:它阻止访问兄弟类型的受保护成员.但Base.Base(Base)显然不会在兄弟类型上调用!这根本没有包含在规范中,或者我错过了为什么这不安全的原因?
编辑:嘎,成语new Base(other.foo)
不是new Base(other)
当Visual Studio 11宣布"图形调试器"功能时,我感到非常高兴,我立即尝试让它在我所拥有的各种项目上工作,不幸的是我只是设法让它适用于Windows 8 Metro应用程序!具体而言,C++ Metro项目模板可以正确运行并捕获所有预期信息.
使用Visual Studio的Developer Preview版本,在Windows 7上,任何在图形调试器(Alt-F5)下启动应用程序的尝试都会在D3D11CreateDeviceAndSwapChain()上崩溃,即使它们正常工作.在我工作的Windows 8 Consumer Preview机器上的Visual Studio 11 Beta上,我得到了更多,图形调试器HUD正确显示,但任何获取捕获的尝试(应用程序中的打印屏幕或工具栏按钮)只会导致一条消息(在输出日志和打开的.vsglog顶部的黄色栏中):
图形诊断引擎无法提供结果,很可能是因为vsglog使得此计算机上不支持DirectX调用.
直接从Metro模板应用程序移植Direct3D调用就是这种情况!我没有看到来自MSDN文档的任何消息,该功能仅用于Metro,所以我希望我只是做一些愚蠢的事情,但是当不在图形调试器下时应用程序正常工作.
其他信息:D3D11_CREATE_DEVICE_DEBUG设置,DirectX控制面板启用Direct3D调试,我得到预期的创建/销毁信息消息,而输出中没有其他消息.
我在当前项目中托管SpiderMonkey,并希望模板函数生成一些简单的属性get/set方法,例如:
template <typename TClassImpl, int32 TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL))
return ::JS_ValueToInt32(cx, *vp, &(pImpl->*mem));
return JS_FALSE;
}
Run Code Online (Sandbox Code Playgroud)
用过的:
::JSPropertySpec Vec2::s_JsProps[] = {
{"x", 1, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::x>, &JsWrap::WriteProp<Vec2, &Vec2::x>},
{"y", 2, JSPROP_PERMANENT, &JsWrap::ReadProp<Vec2, &Vec2::y>, &JsWrap::WriteProp<Vec2, &Vec2::y>},
{0}
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加另一个成员类型,这样可以正常工作:
template <typename TClassImpl, JSObject* TClassImpl::*mem>
JSBool JS_DLL_CALLBACK WriteProp(JSContext* cx, JSObject* obj, jsval id, jsval* vp)
{
if (TClassImpl* pImpl = (TClassImpl*)::JS_GetInstancePrivate(cx, obj, &TClassImpl::s_JsClass, NULL)) …
Run Code Online (Sandbox Code Playgroud) c++ ×2
c# ×1
constructor ×1
direct3d ×1
inheritance ×1
overloading ×1
protected ×1
templates ×1