请教个c++模板类编译问题

coolge 发布于 2012/07/08 09:58
阅读 1K+
收藏 1

最近编译公司的代码,遇到一个模板类编译问题:

在vs2010 下编译是没有问题的,但是linux下编译报错

以下代码是模拟的一个场景,在实例化A的时候, ReferenceCount内接受到的模板参数按照我的理解应该是实例化好的A类型,但是编译报错上看其实传入的是requestT,请教各位大侠这个是由于编译器的原因还是linux下的stl不支持这样的语法    我用的编译器是gcc 4.1.x的

template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
}

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT a,responsetT b)();
   virtual ~A(){}
}


int main()
{
  typea a;
  typeb b;
  A<typea,typeb>(a,b);
  ....
  return 0;
}

加载中
0
Timor君
Timor君
template<typename T,typename U>
class ReferenceCount
{
public:
	ReferenceCount(){}
	~ReferenceCount(){}
	void func(T& a,U b);
};
template<typename T,typename U>
void ReferenceCount<T , U>::func(T& a,U b)
{

}
template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
	A(){}
	//A(requestT a,responseT b)();
	virtual ~A(){}
};


int main()
{
// 	int  a;
// 	typeb b;
	A<int,int>();
	
	return 0;
}

顺手该了一下,可以编译通过,不知道误解你的本意没有。
Timor君
Timor君
在vs2010下编译通过,linux不会。
0
Lunar_Lin
Lunar_Lin
贴代码的时候 最好自己运行一下. 你这里里面一堆小语法错误.
最好能贴下错误内容,不过估计gcc也是一堆恐怖的报错.
1. 换高级点的gcc看看. 4.1还是很偏老了. gcc 3系列对付C++很差, 这4.1离3也不远. =.=||

2. class A:public ReferenceCount<A<requestT,responseT>,int>
=>
class A:public ReferenceCount<typename A<requestT,responseT>,int>
看能不能帮gcc4.1理解理解.

coolge
coolge
额 我上面的代码只是把大概骨架搭了下,下次我会把代码写完整的,呵呵
0
coolge
coolge
此问题已经解决   是编码中有错误   linux下也是可以运行的  多谢各位指教
0
billzheng
billzheng

ReferenceCount作为基类,A类又是public继承,所以ReferenceCount惜购函数必须是virtual否则无法正确 析构子类,行为不确定。

template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    virtual ~ReferenceCount(){}
    void func(T& a,U b);
}

0
永远在一起

我试了一下你简化后的代码,VS2010不能编译通过,一下是我的测试代码

template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT a,responsetT b)();
   virtual ~A(){}
};

class typea { };
class typeb { };


int main()
{
  typea a;
  typeb b;
  A<typea,typeb> c(a,b);
  return 0;
}

VS2010产生如下错误

同时在windows上,使用MinGW,GCC 4.6.2产生如下错误

由于你说公司的代码能在VS2010编译通过,所以怀疑在简化代码的过程中出现了编译错误,导致VS2010都编译不通过。无法帮到你

0
永远在一起
我试了一下你简化后的代码,VS2010不能编译通过,一下是我的测试代码
 
template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};
 
template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT a,responsetT b)();
   virtual ~A(){}
};
 
class typea { };
class typeb { };
 
 
int main()
{
  typea a;
  typeb b;
  A<typea,typeb> c(a,b);
  return 0;
}
 
VS2010产生如下错误
 
同时在windows上,使用MinGW,GCC 4.6.2产生如下错误
 
由于你说公司的代码能在VS2010编译通过,所以怀疑在简化代码的过程中出现了编译错误,导致VS2010都编译不通过。无法帮到你

我试了一下你简化后的代码,VS2010不能编译通过,一下是我的测试代码

template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT a,responsetT b)();
   virtual ~A(){}
};

class typea { };
class typeb { };


int main()
{
  typea a;
  typeb b;
  A<typea,typeb> c(a,b);
  return 0;
}

VS2010产生如下错误

同时在windows上,使用MinGW,GCC 4.6.2产生如下错误

由于你说公司的代码能在VS2010编译通过,所以怀疑在简化代码的过程中出现了编译错误,导致VS2010都编译不通过。无法帮到你

永远在一起
回复 @billzheng : 如下
billzheng
billzheng
回复 @永远在一起 : 把你改过的代码贴出来看看
永远在一起
回复 @billzheng : 改了,但是错误依旧
billzheng
billzheng
你粗心了不是。 A(requestT a,responsetT b)(); 应该为: A(requestT a,responseT b){}
0
永远在一起
template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT & a,responsetT & b) { }
   virtual ~A(){}
};

class typea { };
class typeb { };


int main()
{
  typea a;
  typeb b;
  A<typea,typeb> c(a,b);
  return 0;
}

错误信息

永远在一起
回复 @billzheng : 复制了一下代码,简单改正了一下自己看到的错误,没有仔细检查编译错误。真是不好意思
永远在一起
回复 @永远在一起 : 知道了,resposetT多了一个T,已经没有编译错误了
billzheng
billzheng
responseT not responsetT
永远在一起
回复 @billzheng : 有什么区别
billzheng
billzheng
A(requestT & a,responsetT & b) { } to A(requestT & a,responseT & b) { }
0
永远在一起
template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT & a,responseT & b) { }
   virtual ~A(){}
};

class typea { };
class typeb { };


int main()
{
  typea a;
  typeb b;
  A<typea,typeb> c(a,b);
  return 0;
}

无编译错误

0
Mario_Q
Mario_Q
template<typename T,typename U>
class ReferenceCount
{
public:
    ReferenceCount(){}
    ~ReferenceCount(){}
    void func(T& a,U b);
};

template <typename requestT,typename responseT>
//ReferenceCount 也是一个模板类
class A:public ReferenceCount<A<requestT,responseT>,int>
{
public:
   A(){}
   A(requestT a,responseT b){};
   virtual ~A(){}
};


int main()
{
  int a;
  double b;
  A<int,double>(a,b);

  return 0;
}

返回顶部
顶部