从';类型(cdecl*)(标准::istream)和x27;至';类型及'; 在C++中调用模板函数时,我有一些问题需要理解错误的原因。该函数是rapidjson的一部分,其定义如下: template <unsigned parseFlags, typename InputStream, typename Handler> ParseResult Parse(InputStream& is, Handler& handler) 模板 ParseResult解析(InputStream&is、处理程序和处理程序)
我的电话号码是:从';类型(cdecl*)(标准::istream)和x27;至';类型及'; 在C++中调用模板函数时,我有一些问题需要理解错误的原因。该函数是rapidjson的一部分,其定义如下: template <unsigned parseFlags, typename InputStream, typename Handler> ParseResult Parse(InputStream& is, Handler& handler) 模板 ParseResult解析(InputStream&is、处理程序和处理程序),c++,templates,most-vexing-parse,rapidjson,C++,Templates,Most Vexing Parse,Rapidjson,我的电话号码是: #include <iostream> #include <sstream> #include <fstream> #include "rapidjson/rapidjson.h" #include "rapidjson/reader.h" class IStreamWrapper { public: typedef char Ch; IStreamWrapper(std::istream& is) : is_(is) {
#include <iostream>
#include <sstream>
#include <fstream>
#include "rapidjson/rapidjson.h"
#include "rapidjson/reader.h"
class IStreamWrapper {
public:
typedef char Ch;
IStreamWrapper(std::istream& is) : is_(is) {
}
Ch Peek() const { // 1
int c = is_.peek();
return c == std::char_traits<char>::eof() ? '\0' : (Ch)c;
}
Ch Take() { // 2
int c = is_.get();
return c == std::char_traits<char>::eof() ? '\0' : (Ch)c;
}
size_t Tell() const { return (size_t)is_.tellg(); } // 3
Ch* PutBegin() { assert(false); return 0; }
void Put(Ch) { assert(false); }
void Flush() { assert(false); }
size_t PutEnd(Ch*) { assert(false); return 0; }
private:
IStreamWrapper(const IStreamWrapper&);
IStreamWrapper& operator=(const IStreamWrapper&);
std::istream& is_;
};
struct EmptyHandler {
bool Null() { return true; }
bool Bool(bool b) { return true; }
bool Int(int i) { return true; }
bool Uint(unsigned u) { return true; }
bool Int64(int64_t i) { return true; }
bool Uint64(uint64_t u) { return true; }
bool Double(double d) { return true; }
bool String(const char* str, rapidjson::SizeType length, bool copy) { return true; }
bool StartObject() { return true; }
bool Key(const char* str, rapidjson::SizeType length, bool copy) { return true; }
bool EndObject(rapidjson::SizeType memberCount) { return true; }
bool StartArray() { return true; }
bool EndArray(rapidjson::SizeType elementCount) { return true; }
};
int main(int argc, char*argv[]){
std::ifstream input("example.json");
IStreamWrapper is(std::istream(input));
EmptyHandler handler;
rapidjson::Reader reader;
reader.Parse<rapidjson::kParseDefaultFlags, IStreamWrapper, EmptyHandler>(is, handler);
return 0;
}
#包括
#包括
#包括
#包括“rapidjson/rapidjson.h”
#包括“rapidjson/reader.h”
类IStreamWrapper{
公众:
typedef-char-Ch;
IStreamWrapper(std::istream&is):is_iIS{
}
Ch Peek()常量{//1
int c=is_u2;.peek();
返回c==std::char_traits::eof()?'\0':(Ch)c;
}
Ch Take(){//2
int c=is_u.get();
返回c==std::char_traits::eof()?'\0':(Ch)c;
}
size_t Tell()常量{return(size_t)为u.Tell();}//3
Ch*putbeing(){assert(false);返回0;}
无效Put(Ch){assert(false);}
void Flush(){assert(false);}
大小输出(Ch*){assert(false);返回0;}
私人:
IStreamWrapper(常量IStreamWrapper&);
IStreamWrapper&运算符=(常量IStreamWrapper&);
std::istream&is;
};
结构空句柄{
bool Null(){return true;}
bool bool(bool b){返回true;}
bool Int(inti){return true;}
bool Uint(无符号u){返回true;}
bool Int64(Int64_t i){return true;}
bool Uint64(Uint64_t u){返回true;}
bool Double(Double d){return true;}
bool字符串(const char*str,rapidjson::SizeType length,bool copy){return true;}
bool StartObject(){return true;}
bool键(const char*str,rapidjson::SizeType length,bool copy){return true;}
bool内对象(rapidjson::SizeType memberCount){return true;}
bool StartArray(){return true;}
bool EndArray(rapidjson::SizeType elementCount){return true;}
};
int main(int argc,char*argv[]){
std::ifstream输入(“example.json”);
IStreamWrapper是(std::istream(输入));
空手柄;
rapidjson::读者;
Parse(is,handler);
返回0;
}
但MS Visual Studio 2013向我显示了错误:
error C2664: 'rapidjson::ParseResult rapidjson::GenericReader<rapidjson::UTF8<char>,rapidjson::UTF8<char>,rapidjson::CrtAllocator>::Parse<0,IStreamWrapper,EmptyHandler>(InputStream &,Handler &)' : cannot convert argument 1 from 'IStreamWrapper (__cdecl *)(std::istream)' to 'IStreamWrapper &'
错误C2664:'rapidjson::ParseResult rapidjson::GenericReader::Parse(InputStream&,Handler&'):无法将参数1从'IStreamWrapper(uu cdecl*)(std::istream)'转换为'IStreamWrapper&'
据我所知,用于实例化的类型与传递给模板函数的类型完全相同。这段代码只是为了演示这个问题——在我的原始代码中,istream不是来自一个文件——因此建议对rapidjson的文件使用不同的读取类并不能解决我的问题。我还想了解,为什么这里会发生这种错误
有什么想法吗
IStreamWrapper is(std::istream(input));
相当于
IStreamWrapper is(std::istream input);
i、 例如,它声明一个名为的函数是
接受一个名为input
的类型为std::istream
的参数,并返回一个IStreamWrapper
即使解释为变量声明(不是),std::istream(input)也毫无意义。它将对input
的istream
子对象创建一个istream
临时副本,并在过程中对input
进行切片-但它不会编译,因为无法复制流
此外,由于
IStreamWrapper
存储了一个引用,因此使用一个将立即被销毁的临时流也不是一个好主意。最令人烦恼的解析<代码>是是一个函数。(此外,包装器存储引用,因此无论如何都不应该将其传递为临时流。)