[RESOLVED] help with template template parameters
Hello gurus!
I need some help understanding template template parameters.
Outline of what I'm trying to do is to pass a template vector which is stored in a map,
to a template class that is expecting a vector.
Sort of like,
Psuedo
Code:
template class Foo<A, vector V, B, std::map M>;
In Foo, create M<std::string, V<B<A > > > X;
Define B like;
template class<A, vector V> B;
Pass X::iterator-second to C; // error here
Simplifying it only using vector works,
but when I adapt this workable solution to the model I want,
I get a compilation error (minGW g++).
I spent all night last night and this morning, but I'm stump.
cut down version of class Foo is
Code:
template
<
typename Device,
template<typename> class Container = std::vector,
template<typename> class Configure = Config,
template<typename, typename> class Registry = std::map
>
class BasicSystem
{
template <typename DeviceTrait>
friend std::ostream& operator<<(std::ostream&, const BasicSystem<DeviceTrait*>&);
public:
BasicSystem();
// UI
ResultCode start();
private:
typedef Registry<Input, Container<Configure<Device*> > > iComponent;
iComponent iDevice;
};
and start() member function is a simple initialization prcedure, like
Code:
//////////////////////////////////////////////////////////////////////////////80
// start method
template
<
typename Device,
template<typename> class Container,
template<typename> class Configure,
template<typename, typename> class Registry
>
ResultCode BasicSystem<Device, Container, Configure, Registry>::start()
{
// temporary test
typename iComponent::iterator iter = iDevice.begin();
iter->second.at(0).load("loadme.conf");
///// error here /////
iter->second.at(0).initDevice(iter->second.at(0));
return 0;
}
and the template class that I'm trying to pass to is
Code:
template <typename DeviceTrait, template<typename> class Container = std::vector>
class Config
{
public:
Config();
// UI
Bool load(CRString);
ResultCode initDevice(Container<DeviceTrait*>&, Bool doShow = true);
};
and initDevice method is defined like
Code:
template <typename DeviceTrait, template<typename> class Container>
ResultCode
Config<DeviceTrait, Container>::initDevice(Container<DeviceTrait*>& ref, Bool doShow)
{
std::for_each(ref.begin(), ref.end(),
std::bind2nd(std::mem_fun(&DeviceTrait::init), doShow));
return 19;
}
The compiler keeps telling me that there's no matching functioncall to initDevice(),
but it is myunderstanding that I'm correctly (but apparently wrong) passing a vector.
I'd appreciate if anyone can help.
Thanks
Edit: All these classes are defined in a namespace, if that matters... I'm not sure.
Re: help with template template parameters
this should be wrong:
Code:
template<typename> class Container = std::vector, //...
because vector takes (at least) two template parameters. Thus, it should be "template<typename,typename> class Container".
Re: help with template template parameters
Re: help with template template parameters
Hi superbonzo and souldog!
You guys are correct.
I followed the reference material souldog provided and ta-da, it works.
I was at least aware of how std::vector was declared
(thus wrongly omitting second template default parameter)
But I'm still far from having a solid understanding why I must explicitly do this...
...except a feeling that it somehow relates to how one fully forward declares std::string... No?
Thanks for the help two of you!
Edit:
(and thanks to anyone who might have read and thought about helping but didn't have time :) )