[英]Proper syntax of c++ template class constructor that contains internal template class
我有一個類模板,而該模板又包含一個模板類。 該內部模板類又具有接受函數指針的構造函數。 我以前曾使用此內部類來加載XML文件,現在我正在嘗試使用該類創建XML轉換器。 問題在於為內部類提供足夠的構造函數參數集。
編輯我接受了一些有關臨時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>構造函數帶有3個參數:兩個字符串和一個函數指針。 它返回一個auto_ptr <IN>類型。 我的dummyLoader模板似乎滿足了這一要求,並且我嘗試了一些語法上的細微變化,但錯誤是指。
因此,在實例化FormatConverter對象時,編譯器似乎無法識別我要傳遞的dummyLoader的類型。 誰能解釋為什么?
從字符串中刪除const
:
loader_(dummyLoader, std::string("namespace"), std::string("schema_loc"))
實際上, std::string
具有可完美使用的轉換構造函數:
loader_(dummyLoader, "namespace", "schema_loc")
這樣創建的臨時值非常樂意綁定到常量引用。
由於代碼不完整,所以我無法編譯它,即可能會有更多錯誤。 但是,在以下位置缺少分號:
FormatConverter( string& options )
如果XMLLoader的構造函數需要函數指針,而dummyloader是類的方法,則需要將其綁定到對象(例如this)。
就像是:
std::bind(&FormatConverter<IN, OUT>::dummyLoader, this)
需要傳遞給您試圖傳遞虛擬加載器的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.