编程论坛's Archiver

newyj 发表于 2008-4-30 11:46

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

例子:
template<typename C>
void f(const C& container,      //为什么这句不加typename 怎么来判断嵌套从属类型名称?
       typename C::iterator iter);

sunkaidong 发表于 2008-4-30 12:55

container 就是c类型引用..后面的迭迨器才是嵌套

newyj 发表于 2008-4-30 13:27

谢谢了
能否再举个例子 说一下 什么样的才算嵌套

sunkaidong 发表于 2008-4-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;
}

sunkaidong 发表于 2008-4-30 13:48

对了你尝试过去掉typename吗?

newyj 发表于 2008-4-30 14:01

没有 看书上说 去掉的话 编译器就不知道 C::iterator是类型了
谢谢举的嵌套例子
不过 我想问在类模板中什么时候加typename啊
好象是说 是跟template<typename C>中C有关系的

sunkaidong 发表于 2008-4-30 14:05

你把书上完整的例子弄来看看好啊...一起研究..

sunkaidong 发表于 2008-4-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;
}

sunkaidong 发表于 2008-4-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]]

newyj 发表于 2008-4-30 16:21

辛苦了 真是感谢啊
我试了一下 去掉typename 后 编译器报错了

sunkaidong 发表于 2008-4-30 16:24

我的没有报错...你用什么编译的9#的程序是没问题的

newyj 发表于 2008-4-30 16:56

我用的是Dev-C++

sunkaidong 发表于 2008-4-30 16:58

我用vc++6.0可以哦...

newyj 发表于 2008-4-30 17:10

那我再 看看书上template 的讲解吧
谢谢了

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.