gpt4 book ai didi

c++ fatal error C1001使用可变参数模板

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:31 25 4
gpt4 key购买 nike

大家好。编译我的代码时我遇到了下一个错误:
fatal error 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;
}

最佳答案

试试这个 - 它有效。

#include <stdio.h>
#include <iostream>

template <typename ...> struct param_push;

template <class H, class... T>
struct param_push<H,T...> {
void operator() (H head, T... tail, char** param) {
sprintf(param[0], "%15.15e", head);
param_push<T...> one_less;
one_less(tail..., &param[1]);
}
};

template <>
struct param_push<> {
void operator() (char** param) {
// does nothing, no more args to sprintf
}
};

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 *)
struct param_push<param_types...> functor;
functor(param_values..., params);

for (int i = 0; i < arg_count; ++i) {
std::cout << params[i] << " will be deleted" << std::endl;
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;
}

(现在,Arty Zefirov 的家庭作业:找到使用模板结构仿函数时该技术有效的原因,以及模板函数失败的原因,并根据发现更新您的问题)

关于c++ fatal error C1001使用可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com