我从我的代码中收到“超出装饰名称长度”的警告 我查看了类似问题的 SO 答案。 *注意我知道如何关闭它(pragma),我也知道这是一个我可以“忽略”的警告,基于 unix 的编译器可能不会发出它:P *
这个问题有一个实际因素,如果我遇到错误,我必须费力地浏览一些非常可怕的文本和模板。这些错误目前主要是由于拼写错误造成的,但如果我有任何细微的问题,那么真正找到问题所在将是一场噩梦。
我的代码可以编译并运行,但正如我上面所说的,我收到了警告。我有一个“比较”小的表情
...
auto expression = (l,aComma,w,aComma,x,aComma,y,aComma,z);
std::cout << expression;
我从我为我的表达式模板定义的逗号运算符生成的(如果需要我可以发布但尽量保持最小 - 复制的非常标准的东西):
//
//Expression
//
template < class E >
struct Expr
{
E expr_;
Expr (E e) : expr_ (e) {}
std::ostream& print(std::ostream& out) { return expr_.print(out); }
};
template < class L, class H, class OP >
struct BinExpr
{
L l_;
H h_;
BinExpr (L l, H h) : l_ (l), h_ (h) {}
std::ostream& print(std::ostream& out) { l_.print(out) ; return h_.print(out); }
};
template< class A, class B >
Expr< BinExpr< Expr<A>, Expr<B>, Print<Expr<A>,Expr<B> > > >
operator , ( Expr<A> a, Expr<B> b )
{
typedef BinExpr < Expr<A>, Expr<B>, Print<Expr<A>,Expr<B> > > ExprT;
return Expr<ExprT>(ExprT(a,b));
}
Microsoft 页面讨论了重构以避免此警告。 MS 将每个级别包装在一个普通的 struct 中,然后包含一个模板化的 element 成员。这样做的问题是,编写表达式模板的全部要点是使用隐式构造来创建所需的对象树,避免必须事先准确定义我将要创建的内容。所以……
我想问的问题是,我是否可以在不损失功能和灵 active 的情况下以某种方式对长度进行类型定义?
或者,我能否以某种方式再次使用 Microsoft 的建议来包装部分结构,同时又不失功能和灵 active ?我可以为我将在 Expr 对象中使用的类型执行此操作,因为我将在逗号之间“列出”它们之前设置它们。但是随着我添加更多项目,长度会增加,因此它可能会再次达到这个限制。随着我添加新功能,我也会为此增加更多的复杂性。这些将以类似方式创建,因此很可能会产生更多麻烦......
C++11 是否有任何功能可以帮助我?我尝试了尾随返回类型,但内部 typedef 没有生效(我不确定它会有帮助)。
最佳答案
每当我遇到此警告并查看重构代码以便不发出警告时,我发现在每种情况下都无法进行重构。如果我不需要所有这些模板参数,我一开始就不会把它们放在那里。
MS page还说:
The correctness of the program, however, is unaffected by the truncated name.
基于这个事实,我的 SOP 是 #pragma 警告:
#pragma warning(禁用:4503)
我承认,这个解决方案有点像原子弹。然而,这是唯一实例,我实际上会忽略任何级别的编译器警告,我相信可以安全地忽略它。
关于c++ - 表达式模板 - 修饰名称长度超出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311339/
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我的瘦服务器配置了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_”……这
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
如何将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.你能做的最好的事情是: