typename 在stl中使用,防止编译器类型识别模糊

本文介绍了一种修正C++模板中迭代器声明的方法,解决了在Linux环境下编译时出现的错误。通过使用typename关键字正确指定类型,确保了代码能够正常编译。

template<class T>

void Clear( std::list<T*> ls)

{

    std::list<T*>::iterator it = ls.begin();  // 这一行在linux编译不过,提示:expected ';' before 'it'

    for (; it != ls.end(); ++it)

    {

        //...

    }

    ls.clear();

}

 

修改如下:

template<class T>

void Clear( std::list<T*> ls)

{

   typename  std::list<T*>::iterator it = ls.begin();  

    for (; it != ls.end(); ++it)

    {

        //...

    }

    ls.clear();

}

 

### SystemVerilog 中使用 `$typename` 动态获取变量类型的方法 在 SystemVerilog 中,`$typename` 是一个系统函数,用于返回变量或表达式的类型名称。它以字符串的形式返回变量的解析类型[^2]。以下详细说明如何使用 `$typename` 函数动态获取变量类型。 #### 1. 基本用法 `$typename` 可以直接应用于变量或表达式,返回其类型的字符串表示形式。例如: ```systemverilog int my_int = 42; logic [3:0] my_logic = 4'b1010; initial begin $display("Type of my_int is %s", $typename(my_int)); // 输出 "Type of my_int is int" $display("Type of my_logic is %s", $typename(my_logic)); // 输出 "Type of my_logic is logic [3:0]" end ``` #### 2. 在参数化类中使用 `$typename` 也可以用于参数化类中,动态获取类成员的类型。例如: ```systemverilog class packet #(parameter type I = int); I data; endclass initial begin packet #(bit[3:0]) p1 = new(); packet #(real) p2 = new(); $display("p1.data Type = %s", $typename(p1.data)); // 输出 "p1.data Type = bit [3:0]" $display("p2.data Type = %s", $typename(p2.data)); // 输出 "p2.data Type = real" end ``` #### 3. 在任务和函数中使用 `$typename` 可以嵌入到任务或函数中,用于动态检查输入参数的类型。例如: ```systemverilog function string get_type(input var logic [7:0] data); return $typename(data); // 返回数据类型的字符串表示 endfunction initial begin logic [7:0] my_data = 8'hFF; $display("Data type is %s", get_type(my_data)); // 输出 "Data type is logic [7:0]" end ``` #### 4. 结合 `$bits` 使用 可以将 `$typename` 与 `$bits` 结合使用,同时获取变量的类型和位宽。例如: ```systemverilog logic [15:0] my_logic_var; initial begin $display("Type of my_logic_var is %s with %d bits", $typename(my_logic_var), $bits(my_logic_var)); // 输出 "Type of my_logic_var is logic [15:0] with 16 bits" end ``` #### 5. 注意事项 - `$typename` 返回的是编译时确定的类型信息,无法用于运行时动态分配的类型。 - 如果需要更复杂的类型检查或转换,可以结合 `$typeof` 使用[^2]。 #### 示例代码 以下是一个完整的示例,展示如何在不同场景下使用 `$typename`: ```systemverilog module typename_example; int int_var = 10; logic [7:0] logic_var = 8'hFF; real real_var = 3.14; initial begin $display("Type of int_var is %s", $typename(int_var)); // 输出 "Type of int_var is int" $display("Type of logic_var is %s", $typename(logic_var)); // 输出 "Type of logic_var is logic [7:0]" $display("Type of real_var is %s", $typename(real_var)); // 输出 "Type of real_var is real" class packet #(parameter type T = int); T data; endclass packet #(bit[3:0]) p1 = new(); $display("Type of p1.data is %s", $typename(p1.data)); // 输出 "Type of p1.data is bit [3:0]" end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值