c++致命错误C1001使用可变模板
c++ fatal error C1001 on using variadic template
大家好。在编译代码时,我发现了下一个错误:
致命错误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..., ¶m[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的作业:找到使用模板结构函数时该技术有效的原因,为什么它不能用于模板化函数并使用发现更新您的问题)
下面是在gcc上编译这段代码的输出:
12 : error: declaration of 'args ... args'
void param_push_(T first, args... args, char ** param) {
^
11 : error: shadows template parm 'class ... args'
template <class T, class... args>
^
/tmp/gcc-explorer-compiler116729-61-oaaqho/example.cpp: In function 'void param_push_(T, args ..., char**)':
12 : error: declaration of 'args ... args'
void param_push_(T first, args... args, char ** param) {
^
11 : error: shadows template parm 'class ... args'
template <class T, class... args>
^
/tmp/gcc-explorer-compiler116729-61-oaaqho/example.cpp: In instantiation of 'void exec(const char*, const param_types& ...) [with param_types = {double, double}]':
41 : required from here
27 : error: no matching function for call to 'param_push_(const double&, const double&, char**&)'
param_push_(param_values..., params); //cast parameters to (char *)
^
7 : note: candidate: template<class T> void param_push_(T, char**)
void param_push_(T arg, char ** param) {
^
7 : note: template argument deduction/substitution failed:
27 : note: cannot convert 'param_values#1' (type 'const double') to type 'char**'
param_push_(param_values..., params); //cast parameters to (char *)
^
12 : note: candidate: template<class T, class ... args> void param_push_(T, args ..., char**)
void param_push_(T first, args... args, char ** param) {
^
12 : note: template argument deduction/substitution failed:
27 : note: cannot convert 'param_values#1' (type 'const double') to type 'char**'
param_push_(param_values..., params); //cast parameters to (char *)
^
Compilation failed
你可能需要重新考虑这个:
template <class T, class... Args>
void param_push_(T first, Args... args, char ** param) {
//
// WARNING: param_No will be a different variable for each
// combination of Args...
//
static int param_No = 0;
sprintf(param[param_No++], "%15.15e", first);
param_push(args..., param[param_No]);
}
这是一个新的代码。模板函数不改变当前参数。但应该是这样的,不是吗?
#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_temp, char ** param) {
static int param_No = 0;
sprintf(param[param_No++], "%15.15e", first);
param_push_(args_temp..., param[param_No]);
}
template <class ... param_types>
void my_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;
param_push_<double, double, char**>;
my_exec("SELECT "M",e from orbital WHERE e < $1::double precision AND "M" < $2::double precision",
e_restriction, M_restriction);
return 0;
}
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 在Raspbian上编译pybind11测试用例时出现致命错误
- 致命错误:特征/密集:VSC 中没有此类文件或目录
- v8::HandleScope::CreateHandle() # 中的致命错误无法在没有 HandleScope 的情
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 代码::块C++使用 MacOS 编译 Mojave : 致命错误: sys/cdefs.h: 没有这样的文件或目录
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- 链接:致命错误LNK1104:无法打开文件"python37_d.lib"
- 致命错误 C1001:编译器中发生内部错误。'f:\dd\VCtools\Compiler\cxFE\SL\P1\C\P0io.c'
- 为什么使用openmp时会间歇性出现“致命错误C1001”错误
- 致命错误C1001:编译器中发生内部错误
- C++致命错误 C1001:编译器中发生内部错误
- 致命错误 C1001:尝试使用模板时出现内部错误
- 致命错误 C1001:内部编译器错误(编译器文件"MSC1.cpp",第 1794 行)
- Visual Studio 2015致命错误C1001
- c++致命错误C1001使用可变模板