编写SystemC模板类FIFO_READ_HS时遇‘class T声明’错误求助
SystemC中“declaration of 'class T'”错误排查与解决
错误原因
- 模板类误用
SC_CTOR宏:SystemC的SC_CTOR宏是为非模板类设计的,在模板类中使用时,宏展开后的代码无法正确识别模板参数T,直接触发“declaration of 'class T'”编译错误。 - 同名函数调用歧义:在
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
相关产品推荐
相关产品推荐

