S
Saulius
template<template<typename T> class StoragePolicy>
class construction_info {
// Empty by default, specialize for other types.
};
template<template<typename> class StoragePolicy,
typename ConversionPolicy = DefaultConversions>
class Settings
{
public:
// Construct from construction_info.
Settings(const construction_info<StoragePolicy> &info)
: policy_(info)
{
policy_.Read();
}
private:
// A copy of a constructed data policy.
StoragePolicy<ConversionPolicy> policy_;
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<typename ConversionPolicy>
class Xml
{
public:
// Typedef for quicker typing.
typedef construction_info<Xml> ctor_info; // ERROR!?
// Construct from ctor_info (definition after the class).
Xml(const ctor_info &info)
: c_info_(info) { }
void Read() {
std::cout << "XMLREAD" << std::endl;
}
private:
ctor_info c_info_; // Construction info
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<>
class construction_info<Xml>
{
public:
construction_info(const std::string &filepath)
: filepath_(filepath) {}
std::string filepath_;
};
typedef construction_info<Xml> make_xml;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Settings<Xml> xml( make_xml("D:\\file.xml") );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// DJGPP compiles everything, but msvc.net2k3
// issues this:
//
// d:\code\tests\sett\xml.hpp(19): error C3200:
// 'Xml<ConversionPolicy>' : invalid template argument
// for template parameter 'StoragePolicy', expected a class template
//
// d:\code\tests\sett\xml.hpp(19): error C3200:
// 'Xml<ConversionPolicy>' : invalid template argument
// for template parameter 'StoragePolicy', expected a class template
// with
// [
// ConversionPolicy=DefaultConversions
// ]
//
Any suggestions?
class construction_info {
// Empty by default, specialize for other types.
};
template<template<typename> class StoragePolicy,
typename ConversionPolicy = DefaultConversions>
class Settings
{
public:
// Construct from construction_info.
Settings(const construction_info<StoragePolicy> &info)
: policy_(info)
{
policy_.Read();
}
private:
// A copy of a constructed data policy.
StoragePolicy<ConversionPolicy> policy_;
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<typename ConversionPolicy>
class Xml
{
public:
// Typedef for quicker typing.
typedef construction_info<Xml> ctor_info; // ERROR!?
// Construct from ctor_info (definition after the class).
Xml(const ctor_info &info)
: c_info_(info) { }
void Read() {
std::cout << "XMLREAD" << std::endl;
}
private:
ctor_info c_info_; // Construction info
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template<>
class construction_info<Xml>
{
public:
construction_info(const std::string &filepath)
: filepath_(filepath) {}
std::string filepath_;
};
typedef construction_info<Xml> make_xml;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Settings<Xml> xml( make_xml("D:\\file.xml") );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// DJGPP compiles everything, but msvc.net2k3
// issues this:
//
// d:\code\tests\sett\xml.hpp(19): error C3200:
// 'Xml<ConversionPolicy>' : invalid template argument
// for template parameter 'StoragePolicy', expected a class template
//
// d:\code\tests\sett\xml.hpp(19): error C3200:
// 'Xml<ConversionPolicy>' : invalid template argument
// for template parameter 'StoragePolicy', expected a class template
// with
// [
// ConversionPolicy=DefaultConversions
// ]
//
Any suggestions?