早上好。
我有一个类,技术上只是一个关于char数组的包装器。 它在构造时为字符串分配内存,并在它被破坏时释放它。那不是问题。
只要我想将它传递给任何vararg函数(例如sprintf),就会出现问题
我的编译器抛出一个错误,声明它无法复制non-trivial type
。
经过一次谷歌搜索,它告诉我,“普通类型”是任何类型,可以用memcpy
复制,没有任何构造函数等。
现在我的问题:有没有办法让编译器只用编写变量来传递内部char字符串?
例如:
Wrapper Var("World");
sprintf(Buf, "Hello %s", Var);
在这次电话会议之后,它应该是'Hello World'。
如果我编写(并调用)任何访问内部流的函数(如c_str()
),它就可以工作,但这并不完全是类的目的。
它应该是一个干净的API,它可以像常规字符串一样传递,只需要内存管理功能。
我试过了:
operator char *() {
return InternalString;
}
但它似乎没有被sprintf
调用。
非常感谢你的关注。
答案 0 :(得分:2)
隐式转换运算符不适用于sprintf()
之类的变量arg函数,因为编译器不知道对象需要转换为什么类型。因此,在这种情况下,您需要使用c_str()
函数(或类似函数),或使用static_cast<char*>(Var)
显式投射它。
答案 1 :(得分:1)
实际上,添加一个像'c_str()'这样的成员函数是最好的解决方案 或者您提供了将类型'wrapper'强制转换为char *
的方法答案 2 :(得分:1)
您不能将非POD对象作为变量参数函数的参数传递。 尝试查看Boost格式,或使用C ++ 11编写自己的类型安全sprintf函数