注册 登录
编程论坛 C++教室

关于嵌套从属类型名称的问题?

newyj 发布于 2008-04-30 11:46, 2017 次点击
例子:
template<typename C>
void f(const C& container,      //为什么这句不加typename 怎么来判断嵌套从属类型名称?
       typename C::iterator iter);
13 回复
#2
sunkaidong2008-04-30 12:55
container 就是c类型引用..后面的迭迨器才是嵌套
#3
newyj2008-04-30 13:27
谢谢了
能否再举个例子 说一下 什么样的才算嵌套
#4
sunkaidong2008-04-30 13:38
#include<iostream>
using namespace std;
class a
{
public:
    class b
    {
    public:
        int i;
        int j;
        b(int i1=0,int j1=0):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
    };
        int i;
        int j;
        a(int i1=1,int j1=1):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
};
int main()
{
    a a1;
    a::b b1;
    a1.demo();
    b1.demo();
    return 0;
}
#5
sunkaidong2008-04-30 13:48
对了你尝试过去掉typename吗?
#6
newyj2008-04-30 14:01
没有 看书上说 去掉的话 编译器就不知道 C::iterator是类型了
谢谢举的嵌套例子
不过 我想问在类模板中什么时候加typename啊
好象是说 是跟template<typename C>中C有关系的
#7
sunkaidong2008-04-30 14:05
你把书上完整的例子弄来看看好啊...一起研究..
#8
sunkaidong2008-04-30 14:20
#include<iostream>
using namespace std;
class a
{
public:
    class iterator
    {
    public:
        int i;
        int j;
        iterator(int i1=0,int j1=0):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
    };
        int i;
        int j;
        a(int i1=1,int j1=1):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
      
};
template <typename C>
class b
{
public:
    
  void f(const C& container,typename C::iterator iter){};
};

int main()
{
    a a1;
    a::iterator iter;
    b<a> b1;
    b1.f(a1,iter);
    return 0;
}
#9
sunkaidong2008-04-30 14:21
我的好像要不要都没错的..你看看呢
#include<iostream>
using namespace std;
class a
{
public:
    class iterator
    {
    public:
        int i;
        int j;
        iterator(int i1=0,int j1=0):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
    };
        int i;
        int j;
        a(int i1=1,int j1=1):i(i1),j(j1)
        {

        }
        void demo()
        {
            cout<<i<<"  "<<j<<endl;
        }
      
};
template <typename C>
class b
{
public:
    
  void f(const C& container, C::iterator iter)
  {
      cout<<container.i<<endl;
      cout<<iter.i<<endl;
  };
};

int main()
{
    a a1;
    a::iterator iter;
    b<a> b1;
    b1.f(a1,iter);
    return 0;
}

[[it] 本帖最后由 sunkaidong 于 2008-4-30 14:24 编辑 [/it]]
#10
newyj2008-04-30 16:21
辛苦了 真是感谢啊
我试了一下 去掉typename 后 编译器报错了
#11
sunkaidong2008-04-30 16:24
我的没有报错...你用什么编译的9#的程序是没问题的
#12
newyj2008-04-30 16:56
我用的是Dev-C++
#13
sunkaidong2008-04-30 16:58
我用vc++6.0可以哦...
#14
newyj2008-04-30 17:10
那我再 看看书上template 的讲解吧
谢谢了
1