Typename in C++ Template

今天调一个程序,里面用到了vector,在GDB里面看vector里面的东西一点也不直接,如果碰到vector<vector<int> >,要想看看里面的内容就更不爽了。也可能是我不知道有什么好办法,如果谁知道,麻烦告诉我一下。

没有办法,只要弄个Dump函数来看:

template <class T>
void DumpArrayArray(vector<vector<T> >& arr)
{
    cout<< "Dumping Data:" << endl;
    vector< vector<T> >::iterator outIter = arr.begin();
     for (; outIter!= arr.end(); outIter++)
     {

         vector<T>::iterator inIter = (*outIter).begin();
         for (;inIter!=(*outIter).end();inIter++){
             cout << *inIter << "t";
         }
         cout << endl;
     }
}

猜猜GCC报什么错来着,其实我估计Visual Studio也会报一样的错,编译错哦:

clsAggregateGroups.cpp:In function ‘void DumpArrayArray(std::vector<std::vector<T, std::allocator<_CharT> >, std::allocator<std::vector<T, std::allocator<_CharT> > > >&)’:

clsAggregateGroups.cpp:38: error: expected `;’ before ‘outIter’

见鬼,我明明定义了vector<vector<T> >::iterator outIter的啊,后来我让开林帮我看看,他一离开座位,我就想起来了,这是typename的问题。当我们使用类型推导的时候 vector<vector<T> >::iterator , C++编译器没有办法肯定这个iterator是类型呢,还是变量?所以需要程序员明确的告诉编译器,以前我看STL源码解析的时候看到过的。

所以我应该改成:typename vector<vector<T> >::iterator outIter; 这样编译就过了。

### C++中 `template`、`typename` 和 `class` 的关键字用法及区别 #### 关键词定义与功能 在C++模板编程中,`template`是一个核心概念,用于实现泛型编程。它可以用来创建通用的类或函数,使得这些类或函数可以在不指定具体类型的条件下被编译和使用[^1]。 对于模板参数的声明,既可以使用 `class` 也可以使用 `typename`。两者的主要用途都是为了表示一个占位符类型,该类型将在实例化时由具体的类型替代[^3]。然而,在特定情况下,两者的语义存在细微差别: - **`class`**: 主要用于传统意义上代表类的概念,尽管实际上它也支持任何合法的数据类型(包括原始数据类型)。因此,`class` 可以看作是一种更直观的方式去表达“这是一个类”的含义。 - **`typename`**: 更加现代化且推荐使用的语法形式,特别是在复杂的嵌套依赖类型的情况下更为清晰明了。例如,当涉及到某个类型是另一个类型内部成员时,必须显式地标记为 `typename` 来告诉编译器这确实是一个类型而非变量或其他实体[^4]。 #### 使用场景分析 以下是几种典型的应用场景及其对应的最佳实践建议: 1. **简单模板参数** 当只需要传递单一或者多个独立存在的类型作为模板参数时,可以选择任意一种方式: ```cpp template<class T> void function(T param); template<typename U> void anotherFunction(U param); ``` 2. **处理嵌套类型** 如果涉及到了解构复杂结构体内的类型,则应优先考虑采用 `typename` 进行修饰,以便让编译器能够正确认识到这是个类型名而不是其他东西: ```cpp template<typename Container> auto getFirstElement(const Container& c) -> typename Container::value_type { return *c.begin(); } ``` 上述例子展示了如何访问容器对象 `Container` 所关联的具体元素类型 `_value_type` ,这里如果没有加上前缀 `typename` 就可能导致解析错误[^2]。 3. **特例情况下的选择** 对于一些特殊情形比如继承关系链路较长或者是模板元编程领域里频繁操作各种派生类别之时,往往也会倾向于选用 `typename` 形式的描述更加简洁易懂。 #### 总结对比表 | 特性 | `class` | `typename` | |--------------------|----------------------------------|--------------------------------| | 基本意义 | 表达的是面向对象中的类 | 明确指出后面跟着的东西是个类型 | | 应用范围 | 同样适用于所有可能成为模板参数的对象 | 推荐应用于较为复杂的上下文中 | | 编码风格偏好 | 较旧版本标准下常用 | 新一代编码指南提倡更多运用此选项 | 综上所述,虽然从技术角度来看二者并无本质上的不同之处,但在实际开发过程中遵循一定的规范有助于提高代码可读性和维护效率[^5]。 ```cpp // 示例代码展示两种写法互换的可能性 #include <iostream> template <class T> // 或者 template <typename T> void printValue(T value){ std::cout << "The Value is : "<< value<<std::endl; } int main(){ int num=42; double pi=3.14; printValue<int>(num); // 输出 The Value is : 42 printValue<double>(pi); // 输出 The Value is : 3.14 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值