包装功能只能看到自己?

时间:2015-09-17 19:43:08

标签: c++ function wrapper identifier

对于模糊的标题,我们深表歉意。我不知道该怎么说这个问题。

我正在练习在C ++中使用指针,方法是通过传递引用来重写mergesort程序,但是遇到了问题。要在非递归方法中创建临时数组,我创建了包装函数...

android {
  // your build config
  defaultConfig { ... }
  signingConfigs { ... }
  compileOptions { ... }
  buildTypes { ... }
  // This is important, it will run lint checks but won't abort build
  lintOptions {
      checkReleaseBuilds false
  }
}

......最后调用函数......

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.getSettings().setJavaScriptEnabled(true);
    myWebView.loadUrl("file:///android_asset/www/index.html");
    myWebView.setWebViewClient(new WebViewClient());

}

...但我收到错误'mergesort':函数不带3个参数。好吧,没有,呃,Visual Studio。 为什么它没有看到后者的功能而不是自己调用?

我试图通过抛弃聪明的编码约定并重新命名包装函数<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>example</title> </head> <body> <p>Hi guys</p> <script type="text/javascript"> alert('aaaa'); </script> </body> </html> 并更改主要调用来解决问题,但后来我得到错误'mergesort':找不到标识符即可。我是一名Java小家伙。我根本不明白这一点。非常感谢任何可以提供帮助的人。

2 个答案:

答案 0 :(得分:4)

与其他一些语言不同,自由函数声明在C ++中并未“提升”。它们仅在以前声明的位置可用(或者当您在成员函数定义中并尝试命名另一个成员函数时)。

这就是通常包含在源文件的 top 中的标头通常具有声明的原因:

void mergesort(int *low, int *high, int *barr);
void mergesort(int *low, int *high);

然后你可以在任何你想要的地方定义它们,但是到处都会知道这些功能存在......包括在函数本身中。

在你的特定情况下快速修复是交换定义,因为带有三个参数的重载不需要知道带有两个参数的重载。

答案 1 :(得分:1)

在使用之前,您需要编写3条腿超载的前向声明

void mergesort(int *low, int *high, int *barr);

void mergesort(int *low, int *high){
     int *barr = new int[high-low+1];
     mergesort(*low, *high, *barr); // OK now
}

或者,你也可以在2腿之前定义3腿超载,但如果前者也会调用后者,那么你仍然需要转发声明它。

唯一的例外是当两个函数都是类的成员时,因为在成员定义之前正在解析整个类定义。