?explicit instantiation member function of class template

H

henkoo

i want to explicit instantiate a member function of a class template,
and got some error,
can anyone give some advice to correct it?
3x

complier: g++ 3.2

#include <iostream>
#include <string>
using namespace std;

template <class BT> class FilterRangeItem {
public:
bool m_bIsSetLow;
bool m_bIsSetHigh;
bool m_bIsFailed;
BT m_low;
BT m_high;
FilterRangeItem();
virtual BT _Convert(string);
virtual bool SetFilter(string,string);
};

template <class BT>
FilterRangeItem<BT>::FilterRangeItem() {
m_bIsSetLow = m_bIsSetHigh = m_bIsFailed = false;
}

template <class BT>
BT FilterRangeItem<BT>::_Convert(string str) {
BT a;
cout <<"FilterRAngeItem<BT>::_Convert()"<<endl;
return a;
}

template <class BT>
bool FilterRangeItem<BT>::SetFilter(string low, string high) {
if (low.length()>0) {
m_low = _Convert(low);
if (!m_bIsFailed) m_bIsSetLow = true;
}
if (high.length() > 0) {
m_high = _Convert(high);
if (!m_bIsFailed) m_bIsSetHigh = true;
}
cout <<"SetFilter finished"<<endl;
return m_bIsSetFailed;
}

template int FilterRangeItem<int>::_Convert(string str) {
cout <<"FilterRangeItem<int>::_Convert"<<endl;
return 0;
}
template double FilterRangeItem<double>::_Convert(string str) {
cout <<"FilterRangeItem<double>::_Convert"<<endl;
return 0.0
}

class Filter {
public:
FilterRangeItem<int> iFlt;
FilterRangeItem<double> dFlt;
};

int main(int argc, char* argv[])
{
{
Filter f;
iFlt.SetFilter("3", "5");
dFlt.SetFilter("6.0", "9.10");
}
int x;
cin>>x;

return 0;
}

compiler error:
t1.cpp:43: parse error before `{' token
t1.cpp:47: parse error before `{' token
t1.cpp: In function `int main(int, char**)':
t1.cpp:62: `iFlt' undeclared (first use this function)
t1.cpp:62: (Each undeclared identifier is reported only once for each
function
it appears in.)
t1.cpp:63: `dFlt' undeclared (first use this function)
 
N

Neelesh Bodas

i want to explicit instantiate a member function of a class template,
and got some error,
can anyone give some advice to correct it?

Best advice is to understand the compiler-given errors and fix them one
by one.
complier: g++ 3.2

#include <iostream>
#include <string>
using namespace std;

template <class BT> class FilterRangeItem {
public:
bool m_bIsSetLow;
bool m_bIsSetHigh;
bool m_bIsFailed;
BT m_low;
BT m_high;

It is a *very_bad* idea to declare your data members all public.
FilterRangeItem();
virtual BT _Convert(string);

Avoid using names that start with an underscore, they are reserved for
implementation.
virtual bool SetFilter(string,string);
};

If you expect the class to be polymorphic (as indicated by virtual
functions), always define a virtual destructor.

template <class BT>
FilterRangeItem<BT>::FilterRangeItem() {
m_bIsSetLow = m_bIsSetHigh = m_bIsFailed = false;
}

Use constructor-initialization list instead of assignments in the body
of the constructor.

[...snip...]
template int FilterRangeItem<int>::_Convert(string str) {
cout <<"FilterRangeItem<int>::_Convert"<<endl;
return 0;

This is a complete specialization of the member template. Hence you
need to introduce empty angle-brackets after the word template.

template said:
}
template double FilterRangeItem<double>::_Convert(string str) {
cout <<"FilterRangeItem<double>::_Convert"<<endl;
return 0.0

Same here.
}

class Filter {
public:
FilterRangeItem<int> iFlt;
FilterRangeItem<double> dFlt;
};

int main(int argc, char* argv[])
{
{
Filter f;
iFlt.SetFilter("3", "5");

Whats that? C++ needs variables to be declared before they are used.
dFlt.SetFilter("6.0", "9.10");

Same.

Hope this helps.
 
V

Viktor Prehnal

specialization is done as, in VS.NET otherwise works....

template<> int f(......)
 
H

henkoo

thanks a lot.

also i'd found some snippet on specialization without <> like:

template class vector<int>;

what is it?

p.s. i found your reply after deleting my original post
 
H

henkoo

thanks a lot.

also i'd found some snippet on specialization without <> like:

template class vector<int>;

what is it?

p.s. i found your reply after deleting my original post

Neelesh said:
i want to explicit instantiate a member function of a class template,
and got some error,
can anyone give some advice to correct it?

Best advice is to understand the compiler-given errors and fix them one
by one.
complier: g++ 3.2

#include <iostream>
#include <string>
using namespace std;

template <class BT> class FilterRangeItem {
public:
bool m_bIsSetLow;
bool m_bIsSetHigh;
bool m_bIsFailed;
BT m_low;
BT m_high;

It is a *very_bad* idea to declare your data members all public.
FilterRangeItem();
virtual BT _Convert(string);

Avoid using names that start with an underscore, they are reserved for
implementation.
virtual bool SetFilter(string,string);
};

If you expect the class to be polymorphic (as indicated by virtual
functions), always define a virtual destructor.

template <class BT>
FilterRangeItem<BT>::FilterRangeItem() {
m_bIsSetLow = m_bIsSetHigh = m_bIsFailed = false;
}

Use constructor-initialization list instead of assignments in the body
of the constructor.

[...snip...]
template int FilterRangeItem<int>::_Convert(string str) {
cout <<"FilterRangeItem<int>::_Convert"<<endl;
return 0;

This is a complete specialization of the member template. Hence you
need to introduce empty angle-brackets after the word template.

template said:
}
template double FilterRangeItem<double>::_Convert(string str) {
cout <<"FilterRangeItem<double>::_Convert"<<endl;
return 0.0

Same here.
}

class Filter {
public:
FilterRangeItem<int> iFlt;
FilterRangeItem<double> dFlt;
};

int main(int argc, char* argv[])
{
{
Filter f;
iFlt.SetFilter("3", "5");

Whats that? C++ needs variables to be declared before they are used.
dFlt.SetFilter("6.0", "9.10");

Same.

Hope this helps.
 
H

henkoo

thanks a lot.

also i'd found some snippet on specialization without <> like:

template class vector<int>;

what is it?

p.s. i found your reply after deleting my original post

Neelesh said:
i want to explicit instantiate a member function of a class template,
and got some error,
can anyone give some advice to correct it?

Best advice is to understand the compiler-given errors and fix them one
by one.
template <class BT>
FilterRangeItem<BT>::FilterRangeItem() {
m_bIsSetLow = m_bIsSetHigh = m_bIsFailed = false;
}

Use constructor-initialization list instead of assignments in the body
of the constructor.

[...snip...]
template int FilterRangeItem<int>::_Convert(string str) {
cout <<"FilterRangeItem<int>::_Convert"<<endl;
return 0;

This is a complete specialization of the member template. Hence you
need to introduce empty angle-brackets after the word template.

template said:
}
template double FilterRangeItem<double>::_Convert(string str) {
cout <<"FilterRangeItem<double>::_Convert"<<endl;
return 0.0

Same here.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top