Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从';类型(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 - Fatal编程技术网

从';类型(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
存储了一个引用,因此使用一个将立即被销毁的临时流也不是一个好主意。

最令人烦恼的解析<代码>是是一个函数。(此外,包装器存储引用,因此无论如何都不应该将其传递为临时流。)