这段代码:
abstract class C
{
protected abstract void F(D d);
}
class D : C
{
protected override void F(D d) { }
void G(C c)
{
c.F(this);
}
}
Run Code Online (Sandbox Code Playgroud)
生成此错误:
无法通过类型为"C"的限定符访问受保护的成员'CF(D)'; 限定符必须是'D'类型(或从中派生)
他们在想什么?(会改变那条规则会破坏某些东西吗?)除了让F公开之外,还有其他方法吗?
编辑:我现在明白为什么会这样(感谢格雷格),但我仍然对理性感到有些困惑; 给定:
class E : C
{
protected override void F(D d) { }
}
Run Code Online (Sandbox Code Playgroud)
为什么不应该 D是能够能够调用EF?
编辑错误消息,所以我可能会在那里输入错误.
eclipse在哪里保持键绑定设置?我想将它们从一个系统转移到另一个系统.如果有一个好的工具,但如果没有,我愿意复制文件(实际上两个系统上的所有设置都应该相同.)
我有这个C#代码:
abstract class MyList : IEnumerable<T>
{
public abstract IEnumerator<T> GetEnumerator();
//abstract IEnumerator IEnumerable.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
就是这样,我得到:
'Type'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'.
删除评论,我得到:
修饰符'abstract'对此项无效
如何制作显式实现摘要
直到今天,我一直认为正确的编译器会自动将struct pass-by-value转换为pass-by-reference,如果struct足够大,后者会更快.据我所知,这似乎是一个简单的优化.然而,为了满足我对这是否真的发生的好奇心,我在C++和D中创建了一个简单的测试用例,并查看了GCC和Digital Mars D的输出.两者都坚持按值传递32字节结构有问题的函数是添加成员并返回值,没有修改传入的结构.C++版本如下.
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这样的东西不会被编译器优化为传递引用而不是实际将所有这些推int送到堆栈上?
注意:使用的编译器开关:GCC -O2(-O3内联foo().),DMD -O -inline -release.
编辑:显然,在一般情况下,传值和传递引用的语义将不相同,例如,如果涉及复制构造函数或在被调用者中修改原始结构.但是,在许多现实场景中,语义在可观察行为方面是相同的.这些是我要问的案例.
compiler-construction optimization performance assembly struct
我有一些代码从一个com-port中提取数据,我想在打印之前确保我得到的是一个可打印的字符串(即ASCII,可能是UTF-8).这样做有功能吗?我看了上半打的地方,没有任何看起来像我想要的东西.(字符串有可打印但我没有看到任何东西(在那里,或在字符串方法中)来检查一个字符串中的每个字符是否在另一个字符串中.
注意:控制字符不能用于我的目的.
编辑:我正在寻找单一功能,而不是自己动手解决方案:
我最终得到的是:
all(ord(c) < 127 and c in string.printable for c in input_str)
Run Code Online (Sandbox Code Playgroud) 如果我在一个线程中构造一个对象,然后将一个引用/指针传递给另一个线程,那么该线程的其他线程在没有显式锁定/内存屏障的情况下访问该对象是不安全的吗?
// thread 1
Obj obj;
anyLeagalTransferDevice.Send(&obj);
while(1); // never let obj go out of scope
// thread 2
anyLeagalTransferDevice.Get()->SomeFn();
Run Code Online (Sandbox Code Playgroud)
或者:是否有任何合法的方法在线程之间传递数据,这些方法不会强制执行与线程触及的其他内容相关的内存排序?从硬件的角度来看,我认为没有任何理由不可能.
澄清; 问题是关于缓存一致性,内存排序等等.在线程2的内存视图包含构造中涉及的写入之前,线程2可以获取并使用指针obj吗?错过引用Alexandrescu(?)"一个恶意的CPU设计师和编译器编写者是否可以共同构建一个标准的符合系统来实现这一目标?"
我终于开始学习Java了,我正在寻找一些可以下载和离线阅读的Java文档.像Sun的东西,但拉链或PDF或CHM.
我正在使用Eclipse,因此可以很好地集成Eclipse.它似乎已经有一些我想要的东西(javadoc的东西),但我没有看到如何搜索它,我没有看到语言参考.
我听说D语言具有强大的元编程功能,可以在编译时执行函数.这听起来非常令人兴奋,但我发现很难想到没有它们很难实现的实际例子.
任何人都可以提供一些D的元编程功能非常方便的情况吗?
我正在设置一个最小的chroot,并希望避免使用sudo或su,但仍然以非root身份运行我的进程.这是运行chroot requiers root的一个技巧.我可以编写一个程序,它看起来像这样:
uid = LookupUser(args[username]) // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])
Run Code Online (Sandbox Code Playgroud)
这是我最好的选择,还是有一个标准工具可以帮助我?
我在这里自己动手:
是否有任何(理想的GUI)diff工具可以识别语法?
作为我正在寻找的那种事物的一个例子,我一直发现我当前的工具错过了重复的代码:
Foo = { 'hello': 'world', | Foo = { 'hello': 'world',
'goodnight': 'moon' | 'goodnight': 'moon'
} <
<
Bar = { 'picture': 1000, <
} | }
Run Code Online (Sandbox Code Playgroud)
我想要一个工具,试图在一侧使匹配的支架与另一侧的匹配支架对齐.
编辑:我正在寻找一种工具,可以自动发现该条件并纠正它的对齐.