VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1298|回复: 11

c++模版问题

[复制链接]

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-13 13:00:01 | 显示全部楼层 |阅读模式
我想定义一个map的对象,其中map的第二个参数也是一个模版类型,应该怎么定义
比如说:
template<class T>
class CTypeObject
{
...
}

template class<T> map<string,CTypeObject<T>> m_Object;

这样定义是错误的,但是要怎么定义才正确呢?
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-17 13:09:02 | 显示全部楼层
在模板类里面定义?
template<class T>
class test
{
map<string,CTypeObject<T> > mobj;
}
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-17 19:45:01 | 显示全部楼层
map是在另外一个类中,楼上的这样做不行
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-17 21:36:01 | 显示全部楼层
另外一个类?
不懂你的问题?
如果不是在一个模板类中定义 那么写上具体的类型名称应该就可以了
回复

使用道具 举报

0

主题

41

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-18 16:36:01 | 显示全部楼层
你这定义写法就不对
map<string,CTypeObject<写上具体的类型> > m_Object;
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-19 10:00:01 | 显示全部楼层
就是因为我的类型不确定,就是想写成任意类型的
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-19 10:54:02 | 显示全部楼层
我的代码如下:
template<class T>
class CTypeObject:public CObject
{
public:
        CTypeObject(){}
        ~CTypeObject(){}

        virtual T& GetValue()
        {
                return m_tValue;
        }
        virtual void SetValue(T& tValue)
        {
                m_tValue=tValue;
        }

        virtual void Init()=0;

protected:
        T m_tValue;
};

class CIntegerObject:public CTypeObject<int>
{
public:
        CIntegerObject(int nValue){m_tValue=nValue;}
        ~CIntegerObject(){}

        virtual void Init(){m_tValue=0;}
};

//////////////////////////////////////////////////////////////////////////

class CStringObject:public CTypeObject<string>
{
public:
        CStringObject(string& strValue){m_tValue=strValue;}

        virtual void Init(){m_tValue="";}
};

//////////////////////////////////////////////////////////////////////////

class CFieldType
{
public:
        CFieldType(){}
        ~CFieldType(){}

        template<class T>
        void Register(string strFieldName, CTypeObject<T>* pTypeObject)
        {
                //FieldTypeMap::iterator itr= m_FieldTypeMap.find(strFieldName);
                //if(itr==m_FieldTypeMap.end())
                //{
                //        m_FieldTypeMap.insert(make_pair(strFieldName,pTypeObject));
                //}
        }
        void InitObject()
        {
                //for(FieldTypeMap::iterator itr=m_FieldTypeMap.begin();itr!=m_FieldTypeMap.end();itr++)
                //{
                //        CTypeObject<T>* pTypeObject=itr->second;
                //        pTypeObject->Init();
                //}
        }

private:
        //template class map<string,CTypeObject<T>*> m_FieldTypeMap;
        //FieldTypeMap ;

};
主要想将CTypeObject作为抽象基类
回复

使用道具 举报

0

主题

36

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-1-20 09:45:01 | 显示全部楼层
你的用法类似于template template parameter, std::map不支持这种用法。
回复

使用道具 举报

1

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-23 10:45:01 | 显示全部楼层
好象不行,你的 CTypeObject<int> 和 CTypeObject<string> 都不是从同一个类派生出来的,又怎能用一个抽象基类.


这样定义可不可以

template<class T>
class CTypeObject : BaseClass
{
...
}

map<string,BaseClass> m_Object;
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-23 13:09:02 | 显示全部楼层
这样不知道能否满足你的要求,但编译是没出错误的:

..........
//////////////////////////////////////////////////////////////////////////
template <class T>
class CFieldType
{
public:
    typedef map<string,CTypeObject<T>*>   FieldTypeMap ;
    CFieldType(){}
    ~CFieldType(){}
   
    //template<class T>
    void Register(string strFieldName, CTypeObject<T>* pTypeObject)
    {
        FieldTypeMap::iterator itr= m_FieldTypeMap.find(strFieldName);
        if(itr==m_FieldTypeMap.end())
        {
            m_FieldTypeMap.insert(make_pair(strFieldName,pTypeObject));
        }
    }
    void InitObject()
    {
        for(FieldTypeMap::iterator itr=m_FieldTypeMap.begin();itr!=m_FieldTypeMap.end();itr++)
        {
            CTypeObject<T>* pTypeObject=itr->second;
            pTypeObject->Init();
        }
    }
   
private:
    FieldTypeMap m_FieldTypeMap;
   
};
void main()
{
    CFieldType<string>  sMap;
    sMap.InitObject();
    string x("X");
    CStringObject *ps=new CStringObject(x);
    sMap.Register(x,ps);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表