C1001 编译时错误(无优化)
C1001 Error on complile time (no optimisations)
我正在做一个项目,我需要用不同类型的值保存参数包(元组)(不能重载函数,因为有太多的可能性)。我已到达以下代码但收到错误:
Error C1001 An internal error has occurred in the compiler.
tupletest.cpp 47
我已删除优化并禁用整个程序优化(以及删除漫游和本地中的 visual studio 文件夹以删除规范)
抱歉阅读时间过长(包含大量代码)
也试过以下形式:
template<class arg>
std::tuple<arg> GetTuple()
{...}
template<class arg, typename... args>
std::tuple<arg,args...> GetTuple(json::object::iterator it, json::object::iterator end)
{...}
但是我收到了这样的错误:
Error C2440 'return': cannot convert from 'std::tuple<std::string,int,int,std::string,std::string>' to 'std::tuple<int,int,int,std::string,std::string>'
template<typename... args, class...refargs>
std::tuple<int, args...> GetTupleFromArgs(std::reference_wrapper<int> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<int> GetTupleFromArgs(std::reference_wrapper<int> refarg)
{
return std::make_tuple(refarg.get());
}
template<typename... args, class...refargs>
std::tuple<float, args...> GetTupleFromArgs(std::reference_wrapper<float> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<float> GetTupleFromArgs(std::reference_wrapper<float> refarg)
{
return std::make_tuple(refarg.get());
}
template<typename... args, class...refargs>
std::tuple<std::string, args...> GetTupleFromArgs(std::reference_wrapper<std::string> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<std::string> GetTupleFromArgs(std::reference_wrapper<std::string> refarg)
{
return std::make_tuple(refarg.get());
}
int main()
{
int a = -1;
int b = 2;
int c = 3;
std::string r = "hel";
std::string v = "he2l";
std::tuple<int, int, int, std::string, std::string> tuple = GetTupleFromArgs(std::ref(a), std::ref(b), std::ref(c), std::ref(r), std::ref(v));
//std::cout << _pack.GetInt<0>();
std::cout << "Hello World!\n";
}
我预计元组中的值是 -1,2,3,"hel","he2l"
,但收到编译时间 Error C1001 An internal error has occurred in the compiler.
这是一个编译器错误。
所以编译器内部发生了一些意想不到的事情,这不是(完全)你的错。
无论如何,我看到你混合了类型名称和值名称;例如,在这个函数中
// ................................VVVVVVV
template<typename... args, class...refargs>
std::tuple<int, args...> GetTupleFromArgs(std::reference_wrapper<int> refarg, refargs... refargs)
{ ............................................................................^^^^^^^....^^^^^^^
您命名了 refargs
第二个可变参数列表的类型名称和相应值的名称。
错误的选择。
可能是激活编译器的选择出错了。
GetTupleFromArgs()
的所有三个递归版本都存在同样的问题。
GetTupleFromArgs
的递归版本的另一个问题是无法推导出第一个可变类型列表,因为它是相对于 return 值的。
可能有点话题,但我建议你重写GetTupleFromArgs()
简单如下
template <typename ... As>
std::tuple<As...> GetTupleFromArgs (std::reference_wrapper<As> ... rAs)
{ return { rAs.get() ... }; }
这样可以从函数的参数中推导出单个可变参数列表,不需要递归和重载
另一个建议:避免命名 tuple
类型为 std::tuple
的变量。只是为了避免名称冲突。
以下是您的代码的简化(可编译)版本
#include <tuple>
#include <iostream>
#include <functional>
#include <type_traits>
template <typename ... As>
std::tuple<As...> GetTupleFromArgs (std::reference_wrapper<As> ... rAs)
{ return { rAs.get() ... }; }
int main ()
{
int a = -1;
int b = 2;
int c = 3;
std::string r = "hel";
std::string v = "he2l";
auto tpe = GetTupleFromArgs(std::ref(a), std::ref(b), std::ref(c),
std::ref(r), std::ref(v));
static_assert( std::is_same<decltype(tpe),
std::tuple<int, int, int, std::string, std::string>
>::value, "!" );
}
我正在做一个项目,我需要用不同类型的值保存参数包(元组)(不能重载函数,因为有太多的可能性)。我已到达以下代码但收到错误:
Error C1001 An internal error has occurred in the compiler.
tupletest.cpp 47
我已删除优化并禁用整个程序优化(以及删除漫游和本地中的 visual studio 文件夹以删除规范)
抱歉阅读时间过长(包含大量代码)
也试过以下形式:
template<class arg>
std::tuple<arg> GetTuple()
{...}
template<class arg, typename... args>
std::tuple<arg,args...> GetTuple(json::object::iterator it, json::object::iterator end)
{...}
但是我收到了这样的错误:
Error C2440 'return': cannot convert from 'std::tuple<std::string,int,int,std::string,std::string>' to 'std::tuple<int,int,int,std::string,std::string>'
template<typename... args, class...refargs>
std::tuple<int, args...> GetTupleFromArgs(std::reference_wrapper<int> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<int> GetTupleFromArgs(std::reference_wrapper<int> refarg)
{
return std::make_tuple(refarg.get());
}
template<typename... args, class...refargs>
std::tuple<float, args...> GetTupleFromArgs(std::reference_wrapper<float> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<float> GetTupleFromArgs(std::reference_wrapper<float> refarg)
{
return std::make_tuple(refarg.get());
}
template<typename... args, class...refargs>
std::tuple<std::string, args...> GetTupleFromArgs(std::reference_wrapper<std::string> refarg, refargs... refargs)
{
return std::tuple_cat(std::make_tuple(refarg.get()), GetTupleFromArgs<args...>(refargs...));
}
std::tuple<std::string> GetTupleFromArgs(std::reference_wrapper<std::string> refarg)
{
return std::make_tuple(refarg.get());
}
int main()
{
int a = -1;
int b = 2;
int c = 3;
std::string r = "hel";
std::string v = "he2l";
std::tuple<int, int, int, std::string, std::string> tuple = GetTupleFromArgs(std::ref(a), std::ref(b), std::ref(c), std::ref(r), std::ref(v));
//std::cout << _pack.GetInt<0>();
std::cout << "Hello World!\n";
}
我预计元组中的值是 -1,2,3,"hel","he2l"
,但收到编译时间 Error C1001 An internal error has occurred in the compiler.
这是一个编译器错误。
所以编译器内部发生了一些意想不到的事情,这不是(完全)你的错。
无论如何,我看到你混合了类型名称和值名称;例如,在这个函数中
// ................................VVVVVVV
template<typename... args, class...refargs>
std::tuple<int, args...> GetTupleFromArgs(std::reference_wrapper<int> refarg, refargs... refargs)
{ ............................................................................^^^^^^^....^^^^^^^
您命名了 refargs
第二个可变参数列表的类型名称和相应值的名称。
错误的选择。
可能是激活编译器的选择出错了。
GetTupleFromArgs()
的所有三个递归版本都存在同样的问题。
GetTupleFromArgs
的递归版本的另一个问题是无法推导出第一个可变类型列表,因为它是相对于 return 值的。
可能有点话题,但我建议你重写GetTupleFromArgs()
简单如下
template <typename ... As>
std::tuple<As...> GetTupleFromArgs (std::reference_wrapper<As> ... rAs)
{ return { rAs.get() ... }; }
这样可以从函数的参数中推导出单个可变参数列表,不需要递归和重载
另一个建议:避免命名 tuple
类型为 std::tuple
的变量。只是为了避免名称冲突。
以下是您的代码的简化(可编译)版本
#include <tuple>
#include <iostream>
#include <functional>
#include <type_traits>
template <typename ... As>
std::tuple<As...> GetTupleFromArgs (std::reference_wrapper<As> ... rAs)
{ return { rAs.get() ... }; }
int main ()
{
int a = -1;
int b = 2;
int c = 3;
std::string r = "hel";
std::string v = "he2l";
auto tpe = GetTupleFromArgs(std::ref(a), std::ref(b), std::ref(c),
std::ref(r), std::ref(v));
static_assert( std::is_same<decltype(tpe),
std::tuple<int, int, int, std::string, std::string>
>::value, "!" );
}