首页 新闻 搜索 专区 学院

奇怪!gcc/g++ 编译 C++类模板编译出错 而vs2008编译正常!

0
悬赏园豆:200 [已解决问题] 解决于 2012-07-19 18:29

在ubuntu下面使用g++编译c++程序遇到问题,请大神指点啊!

源程序:

 1 namespace agg
 2 {
 3 
 4 template<class VertexSource, 
 5 class Generator,
 6 class Markers=null_markers> class conv_adaptor_vcgen
 7 {
 8     public:
 9          explicit conv_adaptor_vcgen(VertexSource& source) :
10             m_source(&source), 
11             m_status(initial)
12         {}
13     private:
14     conv_adaptor_vcgen(const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
15         const conv_adaptor_vcgen<VertexSource, Generator, Markers>& 
16             operator = (const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
17 
18         VertexSource* m_source;
19         Generator     m_generator;
20         Markers       m_markers;
21         status        m_status;
22         unsigned      m_last_cmd;
23         double        m_start_x;
24         double        m_start_y;
25 };
26 
27 template<class VertexSource>
28     struct conv_contour : public conv_adaptor_vcgen<VertexSource, vcgen_contour>
29     {
30         typedef conv_adaptor_vcgen<VertexSource, vcgen_contour> base_type;
31         conv_contour(VertexSource& vs):
32              conv_adaptor_vcgen<VertexSource, vcgen_contour>(vs)
33         {}
34     private:
35         conv_contour(const conv_contour<VertexSource>&);
36         const conv_contour<VertexSource>& 
37             operator = (const conv_contour<VertexSource>&);
38 };
39 class ellipse
40     {
41     public:
42         ellipse() : 
43             m_x(0.0), m_y(0.0), m_rx(1.0), m_ry(1.0), m_scale(1.0), 
44             m_num(4), m_step(0), m_cw(false) {}
45 
46         ellipse(double x, double y, double rx, double ry, 
47                 unsigned num_steps=0, bool cw=false) :
48             m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0), 
49             m_num(num_steps), m_step(0), m_cw(cw) 
50         {
51             if(m_num == 0) calc_num_steps();
52         }
53     private:
54         void calc_num_steps();
55         double m_x;
56         double m_y;
57         double m_rx;
58         double m_ry;
59         double m_scale;
60         unsigned m_num;
61         unsigned m_step;
62         bool m_cw;
63     };
64 }

下面是main.cpp里面:

 1 #include <iostream>
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 #include "agg_ellipse.h"
 5 #include "agg_conv_contour.h"
 6 #include "agg_conv_stroke.h"
 7 int main ()
 8 {
 9     agg::ellipse ell(100,100,50,50);
10     typedef agg::conv_contour<agg::ellipse> ell_cc_type;
11         ell_cc_type ccell(ell);
12 }
使用命令:g++ -o agg main.cpp 进行编译
下面是所有的报错信息
1
/tmp/ccgc4XB9.o:In function 'agg::conv_adaptor_vcgen<agg::allipse,agg::vcgen_tour,agg::null_marker>::conv_adaptor_vcgen(agg:allipse&)':main.cpp:(.text.ZN3agg18conv_adaptor_vcgenINS_7ellipseENS_13vcgen_contourENS_12null_markersEEC2ERS1_[_ZN3agg18conv_adaptor_vcgenINS_7ellipseENS_13vcgen_contourENS_12null_markersEEC2ERS1_]+0x18):undefined reference to 'agg:vcgen_contour::vcgen_contour()' 2 collect2:ld返回1

开始以为是conv_contour类里面没有默认构造函数引起的,添加conv_contour(){}后依然报相同错误。。。。。。。

请各位指点一下。。。。。。。。。。

狂热与执着的主页 狂热与执着 | 初学一级 | 园豆:22
提问于:2012-07-18 10:18
< >
分享
最佳答案
1

他说找不到vcgen_contour的默认构造函数。

 

你g++后头少cpp了吧。。

收获园豆:200
荣耀属于跪拜猫 | 小虾三级 |园豆:832 | 2012-07-19 18:22

我有cpp文件的,为什么gcc/g++不会自动加入cpp文件而只编译h文件呢?是不是需要什么参数?

虽然问题自己已经解决了,但是还是把分给你吧。

狂热与执着 | 园豆:22 (初学一级) | 2012-07-19 18:29

@狂热与执着: vs是有个工程的。而gcc的话,本身是不搞工程的。你工程里头所有的文件都要一一指明。比如:

g++ -o output *.cpp

 

如果要额外的做法,请参考是不是使用make。

荣耀属于跪拜猫 | 园豆:832 (小虾三级) | 2012-07-19 20:02

@狂热与执着: 另外,头文件你只要include了的话,他就会过预处理。

荣耀属于跪拜猫 | 园豆:832 (小虾三级) | 2012-07-19 20:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册