public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c++/4072: g++ fails to compile template code
@ 2001-08-21 13:46 adrian.cornish
0 siblings, 0 replies; 2+ messages in thread
From: adrian.cornish @ 2001-08-21 13:46 UTC (permalink / raw)
To: gcc-gnats
>Number: 4072
>Category: c++
>Synopsis: g++ fails to compile template code
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Aug 21 13:46:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Adrian Cornish
>Release: 3.0
>Organization:
>Environment:
System: Linux falcon 2.2.18-SMP #1 SMP Wed Jan 24 12:30:30 GMT 2001 i686 unknown
Architecture: i686
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: /home/adrian/gcc/gcc-3.0/configure --prefix=/usr --enable-threads
>Description:
Apoligies if this bug is the "Two stage lookup in templates is not implemented." mentioned on the gcc web site, but my c++ isn't that good.
g++ fails to compile and hangs with the following error:-
adrian@falcon:/home/adrian/code/c++/testbed> g++ -g -ansi -pedantic it.cpp -o it
In file included from it.cpp:5:
Table.h:36: syntax error before `;' token
Table.h: In constructor `Table<T>::Table()':
Table.h:14: parse error before `;' token
(hangs here)
if it helps here is the process from the process table:-
adrian 16876 16875 68 21:33 pts/7 00:02:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.0/cc1plus -D__GNUC__=3 -D__GNUC_MINOR__=0 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -pedantic -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ it.cpp -D__GNUG__=3 -D__GXX_DEPRECATED -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -D__STRICT_ANSI__ -trigraphs -$ -quiet -dumpbase it.cpp -ansi -g -pedantic -ansi -o /tmp/ccXLye5K.s
>How-To-Repeat:
The following 2 source causes this error:-
/* Table.h */
#ifndef TABLE_H
#define TABLE_H
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
template <class T>
class Table
{
public:
Table(const std::string &filename);
Table() {};
~Table();
bool Insert(T &r);
bool Delete(const T &r);
bool Modify(const T &r);
bool Find(const T &r);
void GoToFirst(void);
bool GetFirst(T &r);
bool GetNext(T &r);
void ShowMemTable(void);
private:
Table(const Table &t);
Table &operator=(const Table &rhs);
void LoadRecords(void);
unsigned long NextRecordNo;
std::string FileName;
std::fstream *FilePtr;
std::vector<T *> Records;
std::vector<T *>::iterator MemPtr;
};
template <class T>
Table<T>::Table(const std::string &filename)
:FileName(filename)
{
NextRecordNo=1;
FilePtr=new std::fstream(FileName.c_str(), std::ios_base::in | std::ios_base::out);
if(!*FilePtr)
{
std::cout << "File does not exist. Creating " << FileName << std::endl;
delete FilePtr;
FilePtr=new std::fstream(FileName.c_str(), std::ios_base::in | std::ios_base::out | std::ios_base::trunc);
*FilePtr << std::setfill('0') << std::setw(10) <<NextRecordNo << std::endl;
if(!*FilePtr)
{
throw std::string("Cannot open file " + FileName);
}
}
// Read next record number from file
FilePtr->seekg(0);
*FilePtr >> NextRecordNo;
if(FilePtr->eof())
{
FilePtr->clear();
}
std::cout << "Next recno=" << NextRecordNo << std::endl;
LoadRecords();
std::cout << Records.size() << " records loaded\n";
}
template <class T>
Table<T>::~Table()
{
std::vector<T *>::iterator i=Records.begin();
for( ; i<Records.end(); i++)
{
delete *i;
}
delete FilePtr;
}
template <class T>
bool Table<T>::Insert(T &r)
{
// Increment record number
r.SetAutoIncrement(NextRecordNo);
Records.push_back(new T(r));
FilePtr->seekp(0, std::ios_base::end);
*FilePtr << r << std::endl;
FilePtr->seekp(0, std::ios_base::beg);
NextRecordNo++;
*FilePtr << std::setfill('0') << std::setw(10) << NextRecordNo << std::endl;
return true;
}
template <class T>
bool Table<T>::Delete(const T &r)
{
return false;
}
template <class T>
bool Table<T>::Modify(const T &r)
{
bool rc=false;
if(Find(r))
{
*FilePtr << r << std::endl;
**MemPtr=r;
if(FilePtr->good())
{
rc=true;
}
}
return rc;
}
template <class T>
bool Table<T>::Find(const T &r)
{
MemPtr=std::find(Records.begin(), Records.end(), r);
if(MemPtr==Records.end())
{
// Dont search file if not in mem table
return false;
}
std::fstream::pos_type save;
T file_rec;
GoToFirst();
while(!FilePtr->eof())
{
save=FilePtr->tellg();
*FilePtr >> file_rec;
if(file_rec==r)
{
std::cout << "Found it\n";
FilePtr->seekg(save, std::ios_base::beg);
FilePtr->seekp(save, std::ios_base::beg);
return true;
}
FilePtr->ignore(1000, '\n');
}
FilePtr->clear();
return false;
}
template <class T>
void Table<T>::GoToFirst(void)
{
FilePtr->seekg(0);
// Skip next rec no
FilePtr->ignore(11, '\n');
MemPtr=Records.begin();
}
template <class T>
bool Table<T>::GetFirst(T &r)
{
GoToFirst();
*FilePtr >> r;
return FilePtr->good();
}
template <class T>
bool Table<T>::GetNext(T &r)
{
*FilePtr >> r;
MemPtr++;
return FilePtr->good();
}
template <class T>
void Table<T>::LoadRecords(void)
{
T rec;
if(GetFirst(rec))
{
Records.push_back(new T(rec));
while(GetNext(rec))
{
Records.push_back(new T(rec));
}
}
if(FilePtr->eof())
{
FilePtr->clear();
}
FilePtr->seekg(0);
FilePtr->seekp(0);
MemPtr=Records.begin();
}
template <class T>
void Table<T>::ShowMemTable(void)
{
std::vector<T *>::iterator i=Records.begin();
for( ; i<Records.end(); i++)
{
std::cout << (**i) << std::endl;
}
}
#endif
/* it.cpp */
#include <iostream>
#include <string>
#include <vector>
#include "Table.h"
using namespace std;
int main(int argc, char *argv[])
{
Table<string> a;
Table<int> b;
return 0;
}
>Fix:
Removing -pedantic from the compile line works
Adrian Cornish
adrian.cornish@bluedreamer.com
>Release-Note:
>Audit-Trail:
>Unformatted:
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: c++/4072: g++ fails to compile template code
@ 2001-08-21 21:53 aoliva
0 siblings, 0 replies; 2+ messages in thread
From: aoliva @ 2001-08-21 21:53 UTC (permalink / raw)
To: adrian.cornish, gcc-bugs, gcc-prs, nobody
Synopsis: g++ fails to compile template code
State-Changed-From-To: open->closed
State-Changed-By: aoliva
State-Changed-When: Tue Aug 21 21:53:08 2001
State-Changed-Why:
Template-dependent qualified type names (such as std::vector<T*>::some_type_name) must be prefixed by the `typename' keyword in Standard C++. This rule is enforced by -pedantic, but not without this flag.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=4072&database=gcc
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2001-08-21 21:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-08-21 13:46 c++/4072: g++ fails to compile template code adrian.cornish
2001-08-21 21:53 aoliva
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).