0

テンプレート クラスを含むクラス テンプレートがあります。その内部テンプレート クラスには、関数ポインターを受け取るコンストラクターがあります。XML ファイルをロードするために以前にこの内部クラスを使用したことがありますが、現在、このクラスを使用して XML コンバーターを作成しようとしています。問題は、内部クラスに適切なコンストラクター パラメーターのセットを提供することです。

EDIT一時的なconst文字列などに関して残されたコメントのいくつかを取り入れ、時間をかけて、まだ私の問題を示している単純化されたケースを作成しました。質問を大幅に編集しました。現在返されているエラーの下に投稿されたコードを使用すると、

FormatConverter/main.cpp:7:   instantiated from here
FormatConverter/FormatConverter.h:52: error: no matching function for call to 'XMLLoader<MessageType1>::XMLLoader(<unknown type>, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
FormatConverter/XMLLoader.h:40: note: candidates are: XMLLoader<XMLTYPE>::XMLLoader(std::auto_ptr<XMLTYPE> (*)(std::istream&, std::string&, std::string&), const std::string&, const std::string&) [with XMLTYPE = MessageType1]
FormatConverter/XMLLoader.h:10: note: XMLLoader<MessageType1>::XMLLoader(const XMLLoader<MessageType1>&)

//main.cpp

#include <iostream>
#include "FormatConverter.h"
#include "MessageTypes.h"

int main (int argc, char * const argv[]) {
std::string options = "";
FormatConverter<MessageType1, MessageType2> fConverter( options );
    return 0;
}

//MessageTypes.h

#ifndef _MTYPES_
#define _MTYPES_

class MessageType1 
{  };

class MessageType2
{  };

#endif

//FormatConverter.h

#ifndef _FORMAT_CONVERTER_
#define _FORMAT_CONVERTER_

#include "XMLLoader.h"
#include <memory>
#include <string>

template<typename T>
::std::auto_ptr<T>
dummyLoader( ::std::istream& dummyStream, std::string dummyFlags, std::string dummyProps )
{
return ::std::auto_ptr<T>( new(T) );
}

template<>
::std::auto_ptr<MessageType1>
dummyLoader( ::std::istream& dummyStream, std::string dummyFlags, std::string dummyProps )
{
return ::std::auto_ptr<MessageType1>( new(MessageType1) );
}

template<>
::std::auto_ptr<MessageType2>
dummyLoader( ::std::istream& dummyStream, std::string dummyFlags, std::string dummyProps )
{
return ::std::auto_ptr<MessageType2>( new(MessageType2) );
}

template <typename IN, typename OUT>
class FormatConverter {
public:
FormatConverter( std::string& options );
virtual ~FormatConverter( void );

void convert( std::auto_ptr<IN> input, std::string& stuff );

private:    
std::string options_;
const std::string dummyFlags;
const std::string dummyProps;

XMLLoader<IN> loader_;
};

template <typename IN, typename OUT>
FormatConverter<IN, OUT>::FormatConverter( std::string& options )
: options_(options)
, dummyFlags("")
, dummyProps("")
, loader_ ( dummyLoader<IN>,
        dummyFlags,
        dummyProps )
{ }

template <typename IN, typename OUT>
FormatConverter<IN,OUT>::~FormatConverter( void )
{ }

template<typename IN, typename OUT>
void
FormatConverter<IN, OUT>::convert( std::auto_ptr<IN> input, std::string& stuff )
{ }
#endif

//XMLLoader.h

#ifndef _XMLLoader_H
#define _XMLLoader_H

#include <memory>
#include <string>

template <typename XMLTYPE>
class XMLLoader
    {
    public:
        typedef ::std::auto_ptr<XMLTYPE> MSG_LOADER( std::istream&,
                                                 std::string&,   //flags
                                                         std::string& ); //properties

        XMLLoader(  MSG_LOADER *loader,
                        const std::string& schemaSource = "NONE",
                        const std::string& ns="" );

        virtual ~XMLLoader(void);
        virtual std::auto_ptr<XMLTYPE> load(std::istream &is);

    private:
        MSG_LOADER* loader_;
        std::string schemaSource_;
        std::string namespace_;
    };

#include <unistd.h>
#include <stdexcept>
#include "XMLLoader.h"

template<typename XMLTYPE>
XMLLoader<XMLTYPE>::XMLLoader(MSG_LOADER* loader,
                              const std::string& schemaSource,
                              const std::string& ns)
: loader_(loader)
, schemaSource_(schemaSource)
, namespace_(ns)
{ /* stuff */ }

template<typename XMLTYPE>
XMLLoader<XMLTYPE>::~XMLLoader( void )
{ }

template<typename XMLTYPE>
::std::auto_ptr<XMLTYPE>
XMLLoader<XMLTYPE>::load( std::istream& is )
{
    std::string flags = "";
    std::string props = "";
    return loader_(is, flags, props );
}

#include "MessageTypes.h"

template
XMLLoader<MessageType1>::XMLLoader(
                                   MSG_LOADER*,
                                   const std::string&,
                                   const std::string& );

template
XMLLoader<MessageType1>::~XMLLoader( void );

template
XMLLoader<MessageType2>::XMLLoader(
                                   MSG_LOADER*,
                                   const std::string&,
                                   const std::string& );

template
XMLLoader<MessageType2>::~XMLLoader( void );
#endif

XMLLoader<IN> コンストラクターは、2 つの文字列と関数ポインターの 3 つの引数を取ります。auto_ptr<IN> タイプを返します。私のダミーローダーテンプレートはその要件を満たしているようで、構文にいくつかのわずかなバリエーションを試しましたが、エラーは .

そのため、コンパイラは、FormatConverter オブジェクトをインスタンス化するときに渡そうとしているダミー ローダーのタイプを識別できないようです。誰でも理由を説明できますか?

4

3 に答える 3

1

const文字列から を削除します。

loader_(dummyLoader, std::string("namespace"), std::string("schema_loc"))

実際、std::string完全にサービス可能な変換コンストラクターがあります。

loader_(dummyLoader, "namespace", "schema_loc")

このように作成された一時的な値は、定数参照に完全にバインドできます。

于 2013-09-19T22:03:31.797 に答える
0

コードが完成していないため、コンパイルできません。つまり、さらにエラーが発生する可能性があります。ただし、次の後にセミコロンがありません。

FormatConverter( string& options )
于 2013-09-19T22:03:34.223 に答える