相关疑难解决方法(0)

从n返回k个元素的所有组合的算法

我想写一个函数,它将一个字母数组作为参数,并选择一些字母.

假设您提供了8个字母的数组,并希望从中选择3个字母.然后你应该得到:

8! / ((8 - 3)! * 3!) = 56
Run Code Online (Sandbox Code Playgroud)

数组(或单词)返回,每个包含3个字母.

algorithm combinations

551
推荐指数
23
解决办法
43万
查看次数

带名称空间的编译器的有趣行为

假设以下代码:

#include <iostream>
using namespace std;

namespace X
{
  class A{};

  void f(A a){}

  void g(int a){}
}

int main()
{
  X::A a;
  f(a);
  g(5);
}
Run Code Online (Sandbox Code Playgroud)

编译代码时,会发生以下编译错误:

main.cpp:在函数'int main()'中:
main.cpp:error:'g'未在此范围内声明

所以函数f编译得很完美,但事实g并非如此.怎么样?它们都属于同一名称空间.编译器是否从类型的参数中推断出该函数f属于X命名空间X::A?在这种情况下编译器如何表现?

c++ namespaces compiler-errors argument-dependent-lookup

32
推荐指数
3
解决办法
1169
查看次数

本地函数声明有用吗?

像我这样的大多数C++程序员在某些方面犯了以下错误:

class C { /*...*/ };

int main() {
  C c();     // declares a function c taking no arguments returning a C,
             // not, as intended by most, an object c of type C initialized
             // using the default constructor.
  c.foo();   // compiler complains here.

  //...
}
Run Code Online (Sandbox Code Playgroud)

现在虽然错误很明显,一旦你知道它我想知道这种本地函数声明是否有任何明智的用途,除了你可以这样做 - 特别是因为没有办法在同一个函数中定义这样的本地函数块; 你必须在其他地方定义它.

我认为Java风格的本地类是一个非常好的功能,我倾向于经常使用,特别是匿名排序.甚至本地C++类(可以具有内联定义的成员函数)也有一些用处.但是这个没有定义的本地函数声明对我来说似乎很尴尬.它只是一个C-legacy还是有一些我不知道的更深层次的用例?

编辑对于非信徒:C c()不是一个函数指针声明.

这个计划

int main()
{
  void g();
  cout << "Hello ";
  g();
  return 0;
}

void g()
{
  cout << …
Run Code Online (Sandbox Code Playgroud)

c++ function local definition

19
推荐指数
2
解决办法
1万
查看次数

函数内部是否有函数声明?

我们可以在函数内声明函数(我想要一个局部变量,但它作为函数声明解析):

struct bvalue;
struct bdict {
    bdict(bvalue);
}
struct bvalue {
    explict operator bdict() const;
}
struct metainfo {
    metainfo(bdict);
}
void foo(bvalue v) {
    metainfo mi(bdict(v)); // parses as function declaration
    metainfo mi = bdict(v); // workaround
                            // (this workaround doesn't work in the presence of explicit ctors)
}
Run Code Online (Sandbox Code Playgroud)

唯一的原因是"因为它使解析器变得更简单"和"因为标准是这样说的",还是有一个不明确的用途?

c c++ declaration

19
推荐指数
2
解决办法
3589
查看次数

为什么获取成员函数指针值甚至需要从类内部进行类名限定?

当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:

class Foo {
public:
    void func(int param) { cout << param << endl; }
    void (Foo::*getPointer())(int) { return &Foo::func; }
};
Run Code Online (Sandbox Code Playgroud)

但如果在getPointer我尝试简单地做:return &func我得到这个错误:

prog.cpp:在成员函数' void (Foo::* Foo::getPointer())(int)':
prog.cpp:8:43:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说' &Foo::func'[-fpermissive]
void (Foo::*getPointer())(int) { return &func; }

为什么我必须在我所在的上下文中指定类?

c++ methods member-function-pointers function-pointers dereference

11
推荐指数
1
解决办法
872
查看次数

不允许嵌套函数,但为什么允许嵌套函数原型?[C++]

我正在阅读相关问题,这个问题引导我提出这个问题.

请考虑以下代码

int main()
{
    string SomeString();
}
Run Code Online (Sandbox Code Playgroud)

总而言之,编译器将其作为函数原型而不是字符串对象.现在考虑以下代码.

int main()
{
    string Some()
    {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器说这是无效的,因为我猜不允许嵌套函数定义.如果不允许,为什么允许嵌套函数原型?它没有给予任何优势而不是混淆(或者我在这里错过了一些有效点?).

我想出以下是有效的.

int main()
{ 
  string SomeFun();
  SomeFun();
  return 0;
}

string SomeFun()
{
  std::cout << "WOW this is unexpected" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这也令人困惑.我期待函数SomeFun()只在main中有一个范围.但是我错了.为什么编译器允许编译如上所述的代码?有没有像上面这样的代码有意义的实时情况?

有什么想法吗?

c++ compiler-construction nested function

7
推荐指数
4
解决办法
3559
查看次数

为什么允许函数体内有函数声明

为什么语法允许在函数体内声明函数?

它确实在这里产生了很多问题,其中函数声明被误认为是变量初始化等。

a object();
Run Code Online (Sandbox Code Playgroud)

更不用说最令人烦恼的解析了。

是否有任何用例无法通过命名空间和成员等更常见的范围隐藏手段轻松实现?

是因为历史原因吗?

附录:如果由于历史原因,从C继承来限制范围,禁止它们有什么问题?

c++

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