小编Joh*_*tes的帖子

为什么拥有私有基类的声明会使类型名称无法访问?

令我感到惊讶的是,在下面的示例中,声明Middle的基类private使该名称在后续派生中不可用作为类型.

class Base {
public:
  Base(Base const& b) : i(b.i) {}

  int i;
};

class Middle : private Base {            //<<<<<<<<<<<
public:
  Middle(Base const* p) : Base(*p) {}
};

class Upper : public Middle {
public:
  Upper(Base const* p) : Middle(p) {}    //<<<<<<<<<<<
};
Run Code Online (Sandbox Code Playgroud)

用g ++编译(Debian 6.3.0-18 + deb9u1)6.3.0 20170516 ......

g++ -std=c++11 privateBase.cpp
Run Code Online (Sandbox Code Playgroud)

我得到以下诊断:

privateBase.cpp:15:9: error: ‘class Base Base::Base’ is inaccessible within this context
   Upper(Base const* p) : Middle(p) {}
         ^~~~
privateBase.cpp:1:12: note: declared here
 class Base {
            ^ …
Run Code Online (Sandbox Code Playgroud)

c++ injected-class-name

10
推荐指数
1
解决办法
202
查看次数

如果allocator提供realloc语义,std :: vector可以避免复制吗?

我有一个内存接口,分离出获取地址空间与附加后备存储.(在Linux下,接口管理的地址空间池是mmap'ed MAP_ANONYMOUS和MAP_NORESERVE,madvise'ed MADV_DONTNEED和mprotect'ed PROT_NONE.然后通过madvise MADV_WILLNEED和mprotect PROT_READ,PROT_WRITE和PROT_EXEC附加支持.)

这个界面允许我分配大量的地址空间,同时懒洋洋地获取实际的物理内存.我想用它来创建一个"懒惰的向量",它在适当的点上提出后备存储请求,但是当它增长时从不复制向量的当前内容.

鉴于标准库的分配器的语义是这样的方案可能吗?感激地接受指针,提示或其他指导.

c++ stl vector realloc allocator

9
推荐指数
1
解决办法
363
查看次数

在C++中以任何方式转发声明函数原型?

我经常使用前向类声明和指向这些类的指针.

我现在需要通过多个层传递函数指针.我更愿意将包含声明我的函数指针原型的头部包含在取消引用函数指针的模块中,而不是包含在简单地传递该指针值的每个层中.

这可能吗?

=====

从答复中我怀疑我没有明确地表达问题.我寻求类似于前瞻性声明.我们都同意我可以写:

foo;

void bar(foo*);

void waz(foo*p){bar(p); }

请注意,除了名称之外,waz对类foo一无所知.也许酒吧可以访问foo的完整描述.也许酒吧只会进一步传递.谁在乎?只有那些取消引用foo*的网站.所有其他网站只需要"class foo;".

同样地,我知道我可以写:

typedef void foo(int,double);

void bar(foo*);

void waz(foo*p){bar(p); }

不同之处在于,现在标识符foo不仅已知表示函数类型,而且还已经携带完整的签名/原型.这迫使我陷入两种不愉快的情景之一:

1)在多个站点克隆typedef(哎呀!脆弱!)2)将typedef粘贴在一个标题中,并将其包含在提到foo*的每个地方.

注意不对称:在数据对象的情况下,我只需要在我想要取消引用foo*的那些点上提供类foo的完整描述; 在函数的情况下,我需要提供完整的签名/原型,我想提到一个foo*.

那么无论如何要弥补这种不对称性?

c++ forward-declaration function-prototypes

8
推荐指数
2
解决办法
8777
查看次数

为什么cout.tellp总是返回-1?

我想为C++文本输出流提供类似标签的功能.该功能应该允许我说"记下这个位置",然后允许多次插入操作,最后允许我说"添加足够的填充字符,以便最终N字符超过最初指出的位置".

标准iostream系统似乎没有保持列位置,但我原以为我可以伪造它tellp().我的假设是tellp()输出序列中两点之间的差异对应于插入字节的数量.

不幸的是,至少在我的Gnu C++环境中,cout并没有保持流位置的虚构.每次cout.tellp()通话returns -1.这是为什么?

c++ iostream cout

6
推荐指数
1
解决办法
812
查看次数

我可以在Doxygen类参考页面上抑制空洞的'更多...'链接吗?

Doxygen类引用页面主要由类成员列表组成,每个列表成员后面跟着它的简要描述(如果存在).成员本身是指向该成员的详细信息页面的链接.总的来说,简要说明后面是"更多..."链接.此链接的内容与该成员的内容相同.这个"更多..."链接建议 - 至少对我来说 - 在该链接的另一端有更多扩展描述.当会员只有简短的描述时,这会产生误导.在这种情况下,链接指向一个简单重复该简短描述的页面,然后指出"在文件abcxyz.ext的NN行定义".

反正有没有让Doxygen压制这些令人沮丧的空洞的"更多..."链接?

doxygen

6
推荐指数
1
解决办法
1216
查看次数

Emacs隐藏/显示对C++三斜杠Doxygen标记的支持?

我使用Doxygen的三斜杠语法来标记我的C++代码.有两个重要案例出现:

1)阻止标记注释,这是线上唯一的元素,可能会或可能不会开始向左冲洗; 例如

class foo
/// A one sentence brief description of foo.  The elaboration can
/// continue on for many lines.
{
    ...
};

void foo::bar
    /// A one sentence brief description of bar.  The elaboration can
    /// continue on for many lines.
    () const
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

2)尾随标记注释,它们在第一行之前总是遵循一定数量的C++标记,但仍可能溢出到后续行; 例如

class foo
{
    int  _var1;                 ///< A brief description of _var1.
    int  _var2;                 ///< A brief description of _var2
                                ///< requiring additional lines.
}

void foo::bar
    ( int arg1 …
Run Code Online (Sandbox Code Playgroud)

c++ emacs doxygen

5
推荐指数
1
解决办法
867
查看次数