【发布时间】:2016-08-29 13:19:39
【问题描述】:
大家好。编译我的代码时遇到了下一个错误:
致命错误 C1001:编译器发生内部错误。
当我只将一个参数传递给“exec”函数时,一切正常。但是当我传递多个参数时,它会发出错误。我分别使用 vs 2015 和 Visual c++ 编译器。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//using namespace std;
template <class T>
void param_push_(T arg, char ** param) {
sprintf(*param, "%15.15e", arg);
}
template <class T, class... args>
void param_push_(T first, args... args, char ** param) {
static int param_No = 0;
sprintf(param[param_No++], "%15.15e", first);
param_push(args..., param[param_No]);
}
template <class ... param_types>
void exec(const char * command, const param_types& ...param_values) {
int arg_count = sizeof...(param_values);
char ** params = new char*[arg_count];
for (int i = 0; i < arg_count; ++i) {
params[i] = new char[22 * sizeof(char)];
}
param_push_(param_values..., params); //cast parameters to (char *)
for (int i = 0; i < arg_count; ++i) {
delete[] params[i];
}
delete[] params;
}
int main()
{
double e_restriction = 0.55300000000000000000124124;
double M_restriction = 5;
exec("SELECT \"M\",e from orbital WHERE e < $1::double precision AND \"M\" < $2::double precision", e_restriction,M_restriction);
return 0;
}
【问题讨论】:
-
“内部错误”意味着这是一个编译器错误,无论您的代码是否有效。在正常情况下,编译器应该要么编译代码,要么打印更合理的错误。
-
尝试将函数“exec”重命名为其他名称。只是一个猜测。不应该对 MS 造成问题,但谁知道呢。除了看一些 MS 资源,因为它是一个编译器问题。
-
用 gcc 试过了。在
param_push_的声明中,尝试为args使用与其类型不同的名称。例如。args... args_而不是args... args(并相应地在 3 行之后将调用更改为param_push)。没有更多的铿锵声 -
当我用 VS2015 编译它时,我得到:
error C2660: 'param_push_': function does not take 3 arguments。只是可以重现它。添加另一个值会导致问题。 -
我在调用递归时更改了“args”参数的名称和固定的函数名称“param_push”。现在我也得到:error C2660: 'param_push_': function does not take 3 arguments
标签: c++ compiler-errors variadic