对于模糊的标题,我们深表歉意。我不知道该怎么说这个问题。
我正在练习在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小家伙。我根本不明白这一点。非常感谢任何可以提供帮助的人。
答案 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腿超载,但如果前者也会调用后者,那么你仍然需要转发声明它。
唯一的例外是当两个函数都是类的成员时,因为在成员定义之前正在解析整个类定义。