【问题标题】:expression template - decorated name length exceeded表达式模板 - 超出修饰名称长度
【发布时间】:2012-10-29 23:10:37
【问题描述】:

我从我的代码中收到“超出装饰名称长度”的警告,我查看了类似问题的 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 成员。这样做的问题是,编写表达式模板的重点是使用隐式构造来创建所需的对象树,避免必须事先准确定义我将要创建的内容。所以……

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

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

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


【问题讨论】:

    标签: c++ templates visual-c++ visual-studio-2012


    【解决方案1】:

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

    MS page 还说:

    但是,程序的正确性不受 被截断的名字。

    基于这一事实,我的 SOP 是向#pragma 发出警告:

    #pragma warning( disable: 4503 )

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

    【讨论】:

    • sigh 我得出了类似的结论,但希望其他人能找到一些帮助。我已经知道解决方法了,但感谢您的回复(顺便说一句/如果我得到更多回复,我会 +1)
    • 如果您确实收到了提供更合适解决方案的其他回复,我可能最终会删除我的答案并采用新的 SOP。
    • @Caribou:实际上,我有点希望你能得到更好的解决方案。我讨厌不得不 #pragma 这些警告消失。
    • 哦,值得一问:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多