You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写SystemC模板类FIFO_READ_HS时遇‘class T声明’错误求助

SystemC中“declaration of 'class T'”错误排查与解决

错误原因

  1. 模板类误用SC_CTOR宏:SystemC的SC_CTOR宏是为非模板类设计的,在模板类中使用时,宏展开后的代码无法正确识别模板参数T,直接触发“declaration of 'class T'”编译错误。
  2. 同名函数调用歧义:在virtual T read()中直接调用read(tmp),编译器会优先匹配基类sc_fifo_in_if<T>的纯虚函数T read(),导致递归调用的编译问题。

解决办法

1. 替换SC_CTOR宏,手动实现模板构造函数

模板类不能依赖SC_CTOR宏生成构造函数,需要手动定义带模板参数的构造函数,并显式初始化sc_module基类。

2. 明确同名函数的调用目标

在virtual T read()中,通过this->read(tmp)明确指定调用当前类的void read(T&)成员函数,避免与基类的同名函数产生歧义。

修正后的完整代码

#include "systemc.h"

template <class T> class FIFO_READ_HS: public sc_module, public sc_fifo_in_if<T>
{
    public:
        // ports
        sc_in_clk clock;
        sc_in<T> data;
        sc_in<bool> valid;
        sc_out<bool> ready;

        // blocking read
        void read(T& x) 
        {
            // signal that we are ready to consume a token
            ready.write(true);
            
            // wait until we've got valid data
            do
                wait(clock->posedge_event());
            while (valid.read() != true);
            
            // read data
            x = data.read();
            
            // no more consumption for the moment
            ready.write(false);
            
        } // end of void read()

        // 手动定义模板类构造函数,替代SC_CTOR宏
        FIFO_READ_HS(sc_module_name name) : sc_module(name)
        {
            ready.initialize(false);
        } // end constructor

        // Dummy implementations for unneeded sc_fifo_in_if<T> methods
        bool nb_read(T&) 
        { 
            assert(0); 
            return false; 
        }
        
        int num_available() const 
        { 
            assert(0); 
            return 0; 
        }
        
        const sc_event& data_written_event() const
        { 
            static sc_event dummy; 
            assert(0); 
            return dummy; 
        }

        virtual T read() 
        {
            T tmp;
            // 明确调用当前类的read(T&)方法
            this->read(tmp);
            return tmp;
            
        }// end of virtual read

};

内容的提问来源于stack exchange,提问作者Crazy Kid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:33:14