我有一些正在使用的库代码。 它在 Visual Studio (2008) 下编译和工作,但不是 GCC (v4.8.4.)
在标题中我们有:
extern const char menu_styles[MENU_COUNT][MAX_LEN];
typedef SysEnum <s_type_t, c_long, no_style, un_style, MAX_LEN, (char *)&menu_styles> MenuStyleEnum;
SysEnum 在哪里(在另一个文件中定义):
template<class ETYPE, class BTYPE, int MINV, int MAXV, int MLEN, char* pStr> class SysEnum
gcc 遇到错误:
error: ‘menu_styles’ cannot appear in a constant-expression
我完全同意。 (此外,它是 const char * 转换为 char *)。
我希望 VS2008 只是用 const char * 而不是 menu_styles 编译这个 typedef,但我真的不确定。
我担心 VisualSudio 正在添加某种类似于构造函数的代码,因此无论何时使用此 typedef,此 char * 确实指向 menu_styles。
用 GCC 编译时,我可以用什么交换它?
最佳答案
你的问题归结为编译
extern const char menu_styles[MENU_COUNT][MAX_LEN];
template<const char* pStr> class SysEnum{
...
};
typedef SysEnum <???> MenuStyleEnum;
我将模板参数更改为 const char* ,因为否则你必须放弃常量,这不是一件好事。基本上问题是什么 ???应该是。
定义 char* 的最常用方法模板参数是有一个char[]某个地方的变量,它会衰减到 char*让每个人都开心:
extern const char menu_style0[MAX_LEN];
typedef SysEnum <menu_style0> MenuStyleEnum;//compiles...
但是,正如评论中已经指出的那样,该标准不允许我们执行以下任何操作:
typedef SysEnum <menu_styles[0]> MenuStyleEnum;
typedef SysEnum <*menu_styles> MenuStyleEnum;
typedef SysEnum <static_cast<const char *>(&menu_styles)> MenuStyleEnum;
我不确定技术限制是导致此行为的原因,毕竟可以找出 menu_styles[0] 的地址在编译期间(VS 正是这样做的)。我的猜测是它无法编译,因为标准是这么说的。
这不会让你在这里有很多选择。如果SysEnum仅使用 pStr 的值指向(类似 cout<<pStr 的代码)并且地址本身并不重要(对于类似 pStr==otherCharPointer 的代码就是这种情况),那么可能有以下解决方法:
#define _MENU_STYLE0_ "STYLE0"
...
extern const char menu_style0[MAX_LEN]= _MENU_STYLE0_;
...
extern const char menu_styles[MENU_COUNT][MAX_LEN]={ _MENU_STYLE0_, _MENU_STYLE1_, ...};
...
typedef SysEnum <menu_style0> MenuStyleEnum;//compiles!
缺点是,相同的信息存在于 menu_styleX 中和 menu_styles ,感觉这不是一个很好的解决方案。
如果只有来自 menu_styles 的值可以是模板参数,它可以更容易声明:
template<size_t Index> class SysEnum{
//use menu_styles[index] for pStr
};
typedef SysEnum <0> MenuStyleEnum;
但是,您将失去使用存储在 menu_styles 中的值的可能性。和一些重构 SysEnum需要。
关于c++ - 模板的 typedef 包括 char[][] - 适用于 VS2008 但不适用于 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938204/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP