表达式模板 - 超出装饰名称长度

时间:2012-11-09 15:51:42

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

我得到一个"装饰的名字长度超过"来自我的代码的警告我已经查看了类似问题的SO答案。 * N.B。我知道如何关闭它(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对象中使用的类型执行此操作,因为我将在&#34;列出&#34;之前设置它们。他们在逗号之间。但是随着我添加更多项目,长度将会增加,因此它可能会再次达到此限制。当我添加新功能时,我还会为此添加更多复杂性。这些将同样创建,因此最有可能产生更多麻烦......

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


1 个答案:

答案 0 :(得分:4)

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

MS page也说:

  

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

基于这个事实,我的SOP将#pragma发出警告:

#pragma warning( disable: 4503 )

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

相关问题