【问题标题】:Template and const模板和常量
【发布时间】:2018-06-14 14:03:19
【问题描述】:

我想我想做什么是不可能的,但我有这个代码:

 22 class Q
 21 {   
 22     int integer;
 23     int fractional;
 24     int word;
 25   public:
 26     Q(int i,int f) { this->integer = i; this->fractional = f; this->word = i+f;}
 27     const int get_i() {return (const int)this->integer;}
 28     const int get_f() {return (const int)this->fractional;}
 29     const int get_w() {return (const int)this->word;}
 30     
 31     friend ostream& operator<<(ostream& os, const Q& q){ os << "Q" << q.integer << "." << q.fractional << " (w:" << q.word << ")"; return os; }
 32 };
 33 
 34 
 35 const Q Q1_i = Q(1,10);
 36 const Q Q1_o = Q(0,11);
 37 
 38 const std::array<Q,1> input_queue_q = {Q1_i};
 39 const std::array<Q,1> output_queue_q = {Q1_o};
 40 
 41 
 42 int sc_main(int argc, char *argv[])
 43 { 
 44   ac_fixed<Q1_i.get_w(),1,false,AC_TRN,AC_SAT> mem;
 45   
 46   for(const Q &input_q : input_queue_q)
 47   { 
 48     for(const Q &output_q : output_queue_q)
 49     { 
 50       ac_fixed<input_q.get_w(),1,false,AC_TRN,AC_SAT> mem;
 51     }
 52   }
 53 }

当我尝试编译时出现以下错误:

check_ac_one_over.cpp: In function ‘int sc_main(int, char**)’:
check_ac_one_over.cpp:44:23: error: passing ‘const Q’ as ‘this’ argument of ‘const int Q::get_w()’ discards qualifiers [-fpermissive]
   ac_fixed<Q1_i.get_w(),1,false,AC_TRN,AC_SAT> mem;
                       ^
check_ac_one_over.cpp:44:23: error: call to non-constexpr function ‘const int Q::get_w()’
check_ac_one_over.cpp:44:23: error: call to non-constexpr function ‘const int Q::get_w()’
check_ac_one_over.cpp:44:46: note: in template argument for type ‘int’ 
   ac_fixed<Q1_i.get_w(),1,false,AC_TRN,AC_SAT> mem;
                                              ^
check_ac_one_over.cpp:44:51: error: invalid type in declaration before ‘;’ token
   ac_fixed<Q1_i.get_w(),1,false,AC_TRN,AC_SAT> mem;
                                                   ^
check_ac_one_over.cpp:50:30: error: passing ‘const Q’ as ‘this’ argument of ‘const int Q::get_w()’ discards qualifiers [-fpermissive]
       ac_fixed<input_q.get_w(),1,false,AC_TRN,AC_SAT> mem;
                              ^
check_ac_one_over.cpp:50:30: error: call to non-constexpr function ‘const int Q::get_w()’
check_ac_one_over.cpp:50:30: error: call to non-constexpr function ‘const int Q::get_w()’
check_ac_one_over.cpp:50:53: note: in template argument for type ‘int’ 
       ac_fixed<input_q.get_w(),1,false,AC_TRN,AC_SAT> mem;
                                                     ^
check_ac_one_over.cpp:50:58: error: invalid type in declaration before ‘;’ token
       ac_fixed<input_q.get_w(),1,false,AC_TRN,AC_SAT> mem;
                                                          ^
make: *** [check_ac_one_over.o] Error 1

我猜问题是 gcc 认为 Q1_i.get_w() 可以改变。有没有办法编译这段代码?我想使用上面定义的类来迭代和使用该模板化类型。

干杯, 斯蒂法诺。

【问题讨论】:

    标签: c++ arrays templates


    【解决方案1】:

    您需要使您的代码“const 正确”。目前是:

    const int get_w() {return (const int)this->word;}
    

    将值返回为const 是没有用的,因为对值的修改不会反映其他任何地方。但是你没有创建方法const,这意味着它不会改变this。应该是:

    int get_w() const {return word;}
    

    括号后面的const表示该方法不会修改任何成员变量(除了那些标记为mutable的,通常没有)。

    【讨论】:

    • 作为模板参数使用,get_w要这样使用,是不是需要显式标记为constexpr
    • @Vivick 我猜你是对的,现在的问题是:check_ac_one_over.cpp:44:23: error: call to non-constexpr function 'const int Q::get_w() const' Ideas ?
    • 如果word 是可变的,那么您不能在模板中使用它。如果它不是可变的,您应该能够将其作为Q 的模板参数而不是成员传递,并将get_w 写为constexpr
    • word 是不可变的,但应该在 Q 类的构造函数中计算。如果可能,我想避免将其作为模板传递。
    • 我已经设法解决了更改代码的问题,但我仍然卡住了。现在的问题是当我对数组进行迭代时:nopaste.xyz/?fd343ad64989f297#40qdVnh2EvkBsl/7H7/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2011-04-17
    相关资源
    最近更新 更多