473,573 Members | 2,849 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Expected constructor, destructor or type conversion before...

5 New Member
Hello, I am trying to compile the TPIE files but there is a file that's constantly giving errors about the templates. I am using gcc 3.4.5 on Eclipse using Windows XP. The following is the code of the file that I am trying to compile:

Expand|Select|Wrap|Line Numbers
  1. // Copyright (c) 1994 Darren Erik Vengroff
  2. //
  3. // File: ami_scan_mac.h
  4. // Author: Darren Erik Vengroff <dev@cs.duke.edu>
  5. // Created: 5/24/94
  6. //
  7. // $Id: ami_scan_mac.h,v 1.10 2003/04/25 00:06:56 tavi Exp $
  8. //
  9. #ifndef _AMI_SCAN_MAC_H
  10. #define _AMI_SCAN_MAC_H
  11.  
  12. // Macros for defining parameters to AMI_scan()
  13. #define __SPARM_BASE(T,io,n) AMI_STREAM< T ## n > *io ## n
  14. #define __SPARM_1(T,io) __SPARM_BASE(T,io,1)  
  15. #define __SPARM_2(T,io) __SPARM_1(T,io), __SPARM_BASE(T,io,2)
  16. #define __SPARM_3(T,io) __SPARM_2(T,io), __SPARM_BASE(T,io,3)
  17. #define __SPARM_4(T,io) __SPARM_3(T,io), __SPARM_BASE(T,io,4)
  18.  
  19. // Macros for defining types in a template for AMI_scan()
  20. #define __STEMP_BASE(T,n) class T ## n
  21. #define __STEMP_1(T) __STEMP_BASE(T,1)  
  22. #define __STEMP_2(T) __STEMP_1(T), __STEMP_BASE(T,2)
  23. #define __STEMP_3(T) __STEMP_2(T), __STEMP_BASE(T,3)
  24. #define __STEMP_4(T) __STEMP_3(T), __STEMP_BASE(T,4)
  25.  
  26. // Temporary space used within AMI_scan
  27. #define __STS_BASE(T,t,n) T ## n t ## n 
  28. #define __STSPACE_1(T,t) __STS_BASE(T,t,1)
  29. #define __STSPACE_2(T,t) __STSPACE_1(T,t) ; __STS_BASE(T,t,2) 
  30. #define __STSPACE_3(T,t) __STSPACE_2(T,t) ; __STS_BASE(T,t,3) 
  31. #define __STSPACE_4(T,t) __STSPACE_3(T,t) ; __STS_BASE(T,t,4) 
  32.  
  33. // An array of flags.
  34. #define __FSPACE(f,n) AMI_SCAN_FLAG f[n]
  35.  
  36.  
  37. // Check stream validity.
  38. #define __CHK_BASE(T,n) {                                               \
  39.     if (T ## n == NULL || T ## n -> status() != AMI_STREAM_STATUS_VALID) {\
  40.         return AMI_ERROR_GENERIC_ERROR;                                 \
  41.     }                                                                   \
  42. }
  43.  
  44. #define __CHKSTR_1(T) __CHK_BASE(T,1)
  45. #define __CHKSTR_2(T) __CHKSTR_1(T) __CHK_BASE(T,2)
  46. #define __CHKSTR_3(T) __CHKSTR_2(T) __CHK_BASE(T,3)
  47. #define __CHKSTR_4(T) __CHKSTR_3(T) __CHK_BASE(T,4)
  48.  
  49.  
  50. // Rewind the input streams prior to performing the scan.
  51. #define __REW_BASE(T,n) {                        \
  52.     if ((_ami_err_ = T ## n -> seek(0)) != AMI_ERROR_NO_ERROR) {    \
  53.         return _ami_err_;                        \
  54.     }                                    \
  55. }
  56.  
  57. #define __REWIND_1(T) __REW_BASE(T,1)
  58. #define __REWIND_2(T) __REWIND_1(T) __REW_BASE(T,2)
  59. #define __REWIND_3(T) __REWIND_2(T) __REW_BASE(T,3)
  60. #define __REWIND_4(T) __REWIND_3(T) __REW_BASE(T,4)
  61.  
  62.  
  63. // Set the input flags to true before entering the do loop so that the
  64. // initial values will be read.
  65. #define __SET_IF_BASE(f,n) f[n-1] = 1
  66.  
  67. #define __SET_IF_1(f) __SET_IF_BASE(f,1)
  68. #define __SET_IF_2(f) __SET_IF_1(f); __SET_IF_BASE(f,2)
  69. #define __SET_IF_3(f) __SET_IF_2(f); __SET_IF_BASE(f,3)
  70. #define __SET_IF_4(f) __SET_IF_3(f); __SET_IF_BASE(f,4)
  71.  
  72. // If the flag is set, then read inputs into temporary space.  Set the
  73. // flag based on whether the read was succesful or not.  If it was
  74. // unsuccessful for any reason other than EOS, then break out of the
  75. // scan loop.  If the flag is not currently set, then either the scan
  76. // management object did not take the last input or the last time we
  77. // tried to read from this file we failed.  If we read successfully
  78. // last time, then reset the flag.
  79. #define __STSR_BASE(t,ts,f,g,e,n)                        \
  80. if (f[n-1]) {                                    \
  81.     if (!(f[n-1] = g[n-1] =                            \
  82.           ((e = ts ## n->read_item(&t ## n)) == AMI_ERROR_NO_ERROR))) {        \
  83.         if (e != AMI_ERROR_END_OF_STREAM) {                    \
  84.             break;                                \
  85.         }                                    \
  86.     }                                        \
  87. } else {                                    \
  88.     f[n-1] = g[n-1];                                \
  89. }
  90.  
  91. #define __STS_READ_1(t,ts,f,g,e) __STSR_BASE(t,ts,f,g,e,1) 
  92. #define __STS_READ_2(t,ts,f,g,e) __STS_READ_1(t,ts,f,g,e)            \
  93.         __STSR_BASE(t,ts,f,g,e,2)
  94. #define __STS_READ_3(t,ts,f,g,e) __STS_READ_2(t,ts,f,g,e)            \
  95.         __STSR_BASE(t,ts,f,g,e,3)
  96. #define __STS_READ_4(t,ts,f,g,e) __STS_READ_3(t,ts,f,g,e)            \
  97.         __STSR_BASE(t,ts,f,g,e,4)
  98.  
  99. // Write outputs.  Only write if the flag is set.  If there is an
  100. // error during the write, then break out of the scan loop.
  101. #define __STSW_BASE(u,us,f,e,n)                            \
  102. if (f[n-1] && (e = us ## n -> write_item(u ## n)) != AMI_ERROR_NO_ERROR) {  \
  103.     break;                                    \
  104. }
  105.  
  106. #define __STS_WRITE_1(u,us,f,e) __STSW_BASE(u,us,f,e,1)
  107. #define __STS_WRITE_2(u,us,f,e) __STS_WRITE_1(u,us,f,e) __STSW_BASE(u,us,f,e,2)
  108. #define __STS_WRITE_3(u,us,f,e) __STS_WRITE_2(u,us,f,e) __STSW_BASE(u,us,f,e,3)
  109. #define __STS_WRITE_4(u,us,f,e) __STS_WRITE_3(u,us,f,e) __STSW_BASE(u,us,f,e,4)
  110.  
  111.  
  112. // Arguments to the operate() call
  113. #define __SCA_BASE(t,n) t ## n
  114. #define __SCALL_ARGS_1(t) __SCA_BASE(t,1)
  115. #define __SCALL_ARGS_2(t) __SCALL_ARGS_1(t), __SCA_BASE(t,2) 
  116. #define __SCALL_ARGS_3(t) __SCALL_ARGS_2(t), __SCA_BASE(t,3) 
  117. #define __SCALL_ARGS_4(t) __SCALL_ARGS_3(t), __SCA_BASE(t,4) 
  118.  
  119. // Operate on the inputs to produce the outputs.
  120. #define __SCALL_BASE(t,nt,if,sop,u,nu,of) \
  121.     sop->operate(__SCALL_ARGS_ ## nt (*t), if, __SCALL_ARGS_ ## nu (&u), of)
  122.  
  123. #define __SCALL_OP_1_1(t,if,sop,u,of) __SCALL_BASE(t,1,if,sop,u,1,of)
  124. #define __SCALL_OP_1_2(t,if,sop,u,of) __SCALL_BASE(t,1,if,sop,u,2,of)
  125. #define __SCALL_OP_1_3(t,if,sop,u,of) __SCALL_BASE(t,1,if,sop,u,3,of)
  126. #define __SCALL_OP_1_4(t,if,sop,u,of) __SCALL_BASE(t,1,if,sop,u,4,of)
  127.  
  128. #define __SCALL_OP_2_1(t,if,sop,u,of) __SCALL_BASE(t,2,if,sop,u,1,of)
  129. #define __SCALL_OP_2_2(t,if,sop,u,of) __SCALL_BASE(t,2,if,sop,u,2,of)
  130. #define __SCALL_OP_2_3(t,if,sop,u,of) __SCALL_BASE(t,2,if,sop,u,3,of)
  131. #define __SCALL_OP_2_4(t,if,sop,u,of) __SCALL_BASE(t,2,if,sop,u,4,of)
  132.  
  133. #define __SCALL_OP_3_1(t,if,sop,u,of) __SCALL_BASE(t,3,if,sop,u,1,of)
  134. #define __SCALL_OP_3_2(t,if,sop,u,of) __SCALL_BASE(t,3,if,sop,u,2,of)
  135. #define __SCALL_OP_3_3(t,if,sop,u,of) __SCALL_BASE(t,3,if,sop,u,3,of)
  136. #define __SCALL_OP_3_4(t,if,sop,u,of) __SCALL_BASE(t,3,if,sop,u,4,of)
  137.  
  138. #define __SCALL_OP_4_1(t,if,sop,u,of) __SCALL_BASE(t,4,if,sop,u,1,of)
  139. #define __SCALL_OP_4_2(t,if,sop,u,of) __SCALL_BASE(t,4,if,sop,u,2,of)
  140. #define __SCALL_OP_4_3(t,if,sop,u,of) __SCALL_BASE(t,4,if,sop,u,3,of)
  141. #define __SCALL_OP_4_4(t,if,sop,u,of) __SCALL_BASE(t,4,if,sop,u,4,of)
  142.  
  143. // Handle the no input case.
  144. #define __SCALL_BASE_O(sop,u,nu,of) \
  145.     sop->operate(__SCALL_ARGS_ ## nu (&u), of)
  146.  
  147. #define __SCALL_OP_O_1(sop,u,of) __SCALL_BASE_O(sop,u,1,of)
  148. #define __SCALL_OP_O_2(sop,u,of) __SCALL_BASE_O(sop,u,2,of)
  149. #define __SCALL_OP_O_3(sop,u,of) __SCALL_BASE_O(sop,u,3,of)
  150. #define __SCALL_OP_O_4(sop,u,of) __SCALL_BASE_O(sop,u,4,of)
  151.  
  152. // Handle the no output case.
  153. #define __SCALL_BASE_I(t,nt,if,sop) \
  154.     sop->operate(__SCALL_ARGS_ ## nt (*t), if)
  155.  
  156. #define __SCALL_OP_I_1(t,if,sop) __SCALL_BASE_I(t,1,if,sop)
  157. #define __SCALL_OP_I_2(t,if,sop) __SCALL_BASE_I(t,2,if,sop)
  158. #define __SCALL_OP_I_3(t,if,sop) __SCALL_BASE_I(t,3,if,sop)
  159. #define __SCALL_OP_I_4(t,if,sop) __SCALL_BASE_I(t,4,if,sop)
  160.  
  161.  
  162. // The template for the whole AMI_scan(), with inputs and outputs.
  163. #define __STEMPLATE(in_arity, out_arity)                    \
  164. template< __STEMP_ ## in_arity (T), class SC, __STEMP_ ## out_arity (U) >   \
  165.  AMI_err AMI_scan( __SPARM_ ## in_arity (T,_ts_),                \
  166.                   SC *soper, __SPARM_ ## out_arity (U,_us_))            \
  167. {                                            \
  168.     __STSPACE_ ## in_arity (T,*_t_);                        \
  169.     __STSPACE_ ## out_arity (U,_u_);                        \
  170.                                             \
  171.     __FSPACE(_if_,in_arity);                            \
  172.     __FSPACE(_lif_,in_arity);                            \
  173.     __FSPACE(_of_,out_arity);                            \
  174.                                             \
  175.     AMI_err _op_err_, _ami_err_;                        \
  176.                                             \
  177.     __CHKSTR_ ## in_arity (_ts_)                                            \
  178.     __CHKSTR_ ## out_arity (_us_)                                           \
  179.     __REWIND_ ## in_arity (_ts_)                        \
  180.     soper->initialize();                            \
  181.                                                                             \
  182.     __SET_IF_ ## in_arity (_if_);                        \
  183.                                                                             \
  184.     do {                                            \
  185.                                             \
  186.         __STS_READ_ ## in_arity (_t_,_ts_,_if_,_lif_,_ami_err_)            \
  187.                                                 \
  188.         _op_err_ = __SCALL_OP_ ## in_arity ## _ ##                \
  189.             out_arity(_t_,_if_,soper,_u_,_of_);                    \
  190.                                             \
  191.         __STS_WRITE_ ## out_arity(_u_,_us_,_of_,_ami_err_)            \
  192.                                                 \
  193.     } while (_op_err_ == AMI_SCAN_CONTINUE);                    \
  194.                                             \
  195.     if ((_ami_err_ != AMI_ERROR_NO_ERROR) &&                    \
  196.         (_ami_err_ != AMI_ERROR_END_OF_STREAM)) {                \
  197.         return _ami_err_;                            \
  198.     }                                            \
  199.                                                 \
  200.     return AMI_ERROR_NO_ERROR;                            \
  201. }
  202.  
  203. // The template for the whole AMI_scan(), with no inputs.  This is
  204. // based on __STEMPLATE_() and could be merged into one big macro at
  205. // the expense of having to define multiple versions of __STEMP_N()
  206. // and __SPARM_N() to handle the case N = 0.
  207. #define __STEMPLATE_O(out_arity)                        \
  208. template< class SC, __STEMP_ ## out_arity (U) >                    \
  209.  AMI_err AMI_scan( SC *soper, __SPARM_ ## out_arity (U,_us_))            \
  210. {                                            \
  211.     __STSPACE_ ## out_arity (U,_u_);                        \
  212.                                             \
  213.     __FSPACE(_of_,out_arity);                            \
  214.                                             \
  215.     AMI_err _op_err_, _ami_err_;                        \
  216.                                                                             \
  217.     __CHKSTR_ ## out_arity (_us_)                                           \
  218.     soper->initialize();                            \
  219.                                             \
  220.     do {                                        \
  221.                                             \
  222.         _op_err_ = __SCALL_OP_O_ ## out_arity(soper,_u_,_of_);            \
  223.                                             \
  224.         __STS_WRITE_ ## out_arity(_u_,_us_,_of_,_ami_err_)            \
  225.                                                 \
  226.     } while (_op_err_ == AMI_SCAN_CONTINUE);                    \
  227.                                             \
  228.     if ((_ami_err_ != AMI_ERROR_NO_ERROR) &&                    \
  229.         (_ami_err_ != AMI_ERROR_END_OF_STREAM)) {                \
  230.         return _ami_err_;                            \
  231.     }                                            \
  232.                                                 \
  233.     return AMI_ERROR_NO_ERROR;                            \
  234. }
  235.  
  236. // The template for the whole AMI_scan(), with no outputs.
  237. #define __STEMPLATE_I(in_arity)                            \
  238. template< __STEMP_ ## in_arity (T), class SC >                    \
  239.  AMI_err AMI_scan( __SPARM_ ## in_arity (T,_ts_), SC *soper)            \
  240. {                                            \
  241.     __STSPACE_ ## in_arity (T,*_t_);                        \
  242.                                             \
  243.     __FSPACE(_if_,in_arity);                            \
  244.     __FSPACE(_lif_,in_arity);                            \
  245.                                             \
  246.     AMI_err _op_err_, _ami_err_;                        \
  247.                                             \
  248.     __CHKSTR_ ## in_arity (_ts_)                                            \
  249.     __REWIND_ ## in_arity (_ts_);                        \
  250.                                             \
  251.     soper->initialize();                            \
  252.                                                                             \
  253.     __SET_IF_ ## in_arity (_if_);                        \
  254.                                                                             \
  255.     do {                                        \
  256.                                             \
  257.         __STS_READ_ ## in_arity (_t_,_ts_,_if_,_lif_,_ami_err_)            \
  258.                                                 \
  259.         _op_err_ = __SCALL_OP_I_ ## in_arity (_t_,_if_,soper);            \
  260.                                             \
  261.     } while (_op_err_ == AMI_SCAN_CONTINUE);                    \
  262.                                             \
  263.     if ((_ami_err_ != AMI_ERROR_NO_ERROR) &&                    \
  264.         (_ami_err_ != AMI_ERROR_END_OF_STREAM)) {                \
  265.         return _ami_err_;                            \
  266.     }                                            \
  267.                                                 \
  268.     return AMI_ERROR_NO_ERROR;                            \
  269. }
  270.  
  271.  
  272. // Finally, the templates themsleves.
  273.  
  274. __STEMPLATE(1,1); __STEMPLATE(1,2); __STEMPLATE(1,3); __STEMPLATE(1,4);
  275. __STEMPLATE(2,1); __STEMPLATE(2,2); __STEMPLATE(2,3); __STEMPLATE(2,4);
  276. __STEMPLATE(3,1); __STEMPLATE(3,2); __STEMPLATE(3,3); __STEMPLATE(3,4);
  277. __STEMPLATE(4,1); __STEMPLATE(4,2); __STEMPLATE(4,3); __STEMPLATE(4,4);
  278.  
  279. __STEMPLATE_O(1); __STEMPLATE_O(2); __STEMPLATE_O(3); __STEMPLATE_O(4);
  280.  
  281. __STEMPLATE_I(1); __STEMPLATE_I(2); __STEMPLATE_I(3); __STEMPLATE_I(4);
  282.  
  283. #endif // _AMI_SCAN_MAC_H 
  284.  
The error messages are Expected constructor, destructor or type conversion before... in each of the following lines 274-281!

Any ideas? Thanks
Jul 15 '07 #1
2 2490
weaknessforcats
9,208 Recognized Expert Moderator Expert
Here is what I see:

Line 163

#define __STEMPLATE(in_ arity, out_arity)

Line 207

#define __STEMPLATE_O(o ut_arity)

Line 237

#define __STEMPLATE_I(i n_arity)

Line 274

__STEMPLATE(1,1 ); __STEMPLATE(1,2 ); __STEMPLATE(1,3 ); __STEMPLATE(1,4 );

The macro __STEMPLATE is redefined three times before you get to line Line274. At that point it has one argument. Line 274 shows it with two arguments which leads the compiler to believe it may be a struct or class and if itr is, it needs a constructor with two arguments.

There's all sorts is bad stuff in here:

__STEMPLATE(1,1 );

is a macro expansion which is supposed to create a function. That's fine except the function is being defined in the header file. You never put code in a header file. These macro expansions (after the macro definition is fixed) belong in an implementation file (.cpp).

Based on the date of the header file (1994), templates were a new thing and this author doesn't know how they work.

I suggest a rewrite of this file in C++ correctly using templates and you difficulties will go away.
Jul 15 '07 #2
weaknessforcats
9,208 Recognized Expert Moderator Expert
Oops. I have misread this file. My apologies.

Let me look at it again.
Jul 15 '07 #3

Sign in to post your reply or Sign up for a free account.

Similar topics

6
19245
by: Zenon | last post by:
Folks, I cannot figure out why I am getting an error: Error E2303 EngineX.hpp 19: Type name expected. Here is my code. Can you please help? #ifndef EngineX__hpp #define EngineX__hpp #include<iostream> #include <cstring> #include <cmath>
5
24706
by: Preben | last post by:
Hi, I get this error when trying to compile: -------- # g++ -c KGreyImage.cpp KGreyImage.cpp:25: error: expected constructor, destructor, or type conversion before '*' token --------
5
21151
by: Damien | last post by:
Hi all, I'm using a pretty standard C++ Singleton class, as below: template <typename T> class Singleton { public: static T* Instance() {
7
2154
by: pallav | last post by:
I'm having some trouble with my copy constructor. I've tried using gdb to find the bug, but it seg faults in the destructor. I'm not able to see what I'm doing wrong. Since I'm using pointers, I need deep copy and I believe I'm doing that in my constructors. Can someone help me see what I'm missing out? Here is my code. typedef...
2
532
by: algatt | last post by:
Hello, I am trying to compile the TPIE files but there is a file that's constantly giving errors about the templates. I am using gcc 3.4.5 on Eclipse using Windows XP. The following is the code of the file that I am trying to compile: Code: 1. // Copyright (c) 1994 Darren Erik Vengroff 2.
5
7964
by: amitmool | last post by:
hi, i have used the queue library file and try to use the template as template <class QueueItem> queue <QueueItem>::~queue() // line 25 { } template <class QueueItem> void queue<QueueItem>::push(const QueueItem& entry) // line 42
12
7182
by: Rahul | last post by:
Hi Everyone, I have the following code and i'm able to invoke the destructor explicitly but not the constructor. and i get a compile time error when i invoke the constructor, why is this so? class Trial { public: Trial() {
2
3525
by: parvtb | last post by:
I have the following code: #include <list> using namespace std; template <typename T> list<T>::iterator doStuff( list<T>::iterator myIter ) //--error here
10
15743
by: preeya | last post by:
Hi, I have written the following program: ------------------------------------------------------------------------------------------------------------- 1 #include <stdio.h> 2 #include "abc.h" 3 4 void PROP_abc(double ptr)
0
7760
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
0
7679
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language...
0
8191
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
0
6392
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
1
5573
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes...
0
3724
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in...
0
3723
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
2185
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
0
1029
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.