Typedef-为什么这个C ++代码有效?

时间:2014-05-08 09:08:09

标签: c++ stl

这里有一些用C ++编写的代码:

#include <iostream>
int main(){
    typedef map<int,int> b;
    b tC;

    b::iterator iMap;
    b().swap(tC);
}

我试过了:
b.swap(tc); 但我一直收到错误。

我无法理解的是,为什么它不能成为b.swap(tC);

这是编译器问题吗?

抱歉我的英文。

3 个答案:

答案 0 :(得分:9)

因为b是一种类型。您无法在某种类型上调用swap。您需要构建b类型的对象,然后在其上调用swap,这就是您对b().swap(tC);所做的事情

此行typedef map<int,int> b;正在创建名为b的新类型,其属性为map<int,int>。因此,为了使用类型bb类型的对象,您必须遵循与使用类map<int,int>相同的规则。

在班级map中,函数swap是一个成员函数。这就是为什么你需要一个对象才能使用它。如果它是一个静态函数,你可以直接在类型上调用它,虽然它的语法有点不同:b::static_function()

答案 1 :(得分:3)

因为只能通过对象调用成员函数,所以在调用swap之前需要先创建一个对象。因此:

b().swap(tC);

您正在创建临时对象并使用tC进行交换。

答案 2 :(得分:3)

如果b::swap(x)是静态类方法,那么

b.swap(x)(但不是swap()!)会有效。但是swap()是一个实例方法,因此只能用于类b的对象的实例(typedef的{​​{1}})。

map<int,int>不会发出错误,因为它适用于类b().swap(x)的对象的实例。但是,此调用可能不太有用,因为实例化后会立即销毁此实例b