6

我从我的代码中收到“超出装饰名称长度”的警告,我查看了类似问题的 SO 答案。*NB 我知道如何关闭它(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 将每个级别包装在一个plainstruct中,然后包含一个模板化element成员。这样做的问题是,编写表达式模板的重点是使用隐式构造来创建所需的对象树,避免必须事先准确定义我将要创建的内容。所以...

  • 我想问的问题是我是否可以在不失去功能和灵活性的情况下以某种方式将长度缩小?

  • 或者,我能否以某种方式再次使用 Microsoft 的建议来包装部分结构,而不会失去功能和灵活性?我可以为要在Expr对象中使用的类型执行此操作,因为我将在逗号之间“列出”它们之前设置它们。但是随着我添加更多项目,长度会增加,因此它可能会再次达到这个限制。随着我添加新功能,我还将为此添加更多复杂性。这些将被类似地创建,因此很可能会产生更多的头痛......

  • 我可以使用 C++11 的任何功能来提供帮助吗?我尝试了尾随返回类型,但内部 typedef 没有生效(我不确定它会有所帮助)。


4

1 回答 1

4

每当我遇到这个警告并考虑重构代码以便不发出警告时,我发现在每种情况下重构都是不可能的。如果我不需要所有这些模板参数,我一开始就不会在那里拥有它们。

MS页面还说:

但是,程序的正确性不受截断名称的影响。

基于这个事实,我的 SOP 是#pragma警告远离:

#pragma warning( disable: 4503 )

我承认,这个解决方案有点像原子弹。然而,这是我实际上会忽略任何级别的编译器警告的唯一实例,我相信可以安全地忽略它。

于 2012-11-09T16:02:18.397 回答