none
泛型编程,为什么我这里的类型名称报错? RRS feed

  • 问题

  • 问题不太好描述,一看代码大佬肯定明白我的意思了。

    在使用vecotr<int>::iteator声明/定义变量时我们没有使用typename修饰, 那么如何自己实现一个类似这样用法的iteator类型。 template <typename T> class MyClass { public: typedef _iteator MyIteator<T>; }; template<typename T> class MyIteator { }; typedef _iteator MyIteator<T>;这里是不是也不知道MyIteator<T>是一个类型,所以使用typename修饰一下

    ,表明这是类型名称。 然后修改成 using type = typename MyIteator<T>; typedef type _iteator;

    之后又改成

    using _MyBase = MyIteator<T>;
    using _iteator = typename _MyBase;

    这样还是不行,请问如何修改?








    2019年9月27日 8:28

答案

  • 应该是:

    template<typename T>
    class MyIteator
    {
    public:
    	static T a;
    };
    
    template <typename T>
    class MyClass
    {
    public:
    	using _MyBase = MyIteator<T>;
    	using _iteator = typename _MyBase;
    
    };
    
    int main()
    {
    	MyClass<int>::_iteator myIteator;
    }

    2019年9月27日 13:34

全部回复

  • 你好,

    感谢你在MSDN论坛发帖。

    你是想要在自己的类中实现一个迭代器吗?那需要知道迭代器有什么功能。

    >>那么如何自己实现一个类似这样用法的iteator类型。

    迭代器最重要的特性提供一个遍历容器内部所有元素的接口,因此迭代器的内部必须保存一个与容器相关联的指针,然后重载各种运算操作来方便遍历,其中最重要的就是∗运算符和->运算符,以及++,–-等可能需要的运算符重载。但我在你的类内部没看到这些重载操作符的操作。

    底下代码实现了指针的操作符重载的方法,仅供参考。

    #include <iostream>
    #include <numeric>
    
    template<class type_name>
    class test 
    {
    	type_name* ptr;
    
    public:
    	test(type_name* p = 0) :ptr(p) {}//初始化操作
    
    	//重载操作符
    	type_name& operator*()const {
    		return *ptr;
    	}
    	type_name* operator->()const {
    		return ptr;
    	}
    	test& operator++() {
    		++ptr;
    		return *this;
    	}
    	test operator++(int) {
    		test tmp = *this;
    		++* this;
    		return tmp;
    	}
    
    	bool operator==(const test& iter) {
    		return ptr == iter.ptr;
    	}
    	bool operator!=(const test& iter) {
    		return !(*this == iter);
    	}
    };
    int main() 
    {
    	int a[] = { 1, 2, 3, 4 ,5};
    	std::cout << std::accumulate(test<int>(a), test<int>(a + 5), 0);//输出 10
    }

    Best Regards,

    Suarez Zhou


    2019年9月27日 10:02
  • 我的问题不是实现迭代器,问题就简单的说:

    template <typename T>
    class MyClass
    {
    public:
    	using _MyBase = MyIteator<T>;
    	using _iteator = typename _MyBase;
    
    };
    
    template<typename T>
    class MyIteator
    {
    public:
    	static T a;
    };
    
    
    int main()
    {
    	MyClass<int>::_iteator myIteator;
    }

    为什么报错,说 

    语法错误: 标识符“MyIteator”

    2019年9月27日 11:52
  • 应该是:

    template<typename T>
    class MyIteator
    {
    public:
    	static T a;
    };
    
    template <typename T>
    class MyClass
    {
    public:
    	using _MyBase = MyIteator<T>;
    	using _iteator = typename _MyBase;
    
    };
    
    int main()
    {
    	MyClass<int>::_iteator myIteator;
    }

    2019年9月27日 13:34
  • 原来如此。不过只看过函数要提前定义的,原来类也要啊。
    2019年9月28日 13:43