我目前正在为CLI / C ++中的本机C ++类编写包装器。我现在正在上GamePacket
课。考虑以下课程:
public ref class GamePacket
{
public:
GamePacket();
~GamePacket();
generic<typename T>
where T : System::ValueType
void Write(T value)
{
this->bw->Write(value);
}
};
我希望我能够使用我的Wrapper在C#中调用该函数:
Packet.Write<Int32>(1234);
Packet.Write<byte>(1);
但是,我无法编译我的包装器。错误:
Error 1 error C2664: 'void System::IO::BinaryWriter::Write(System::String ^)' : cannot convert argument 1 from 'T' to 'bool'
我不明白这个错误,System::String^
来自哪里。我看到Write()
方法有很多重载,CLI / C ++没有调用正确的方法,如果是这样,我怎样才能调用正确的方法呢?
参考MSDN:http://msdn.microsoft.com/en-us/library/system.io.binarywriter.write(v=vs.110).aspx
答案 0 :(得分:1)
模板和泛型不起作用。
使用模板,代码会针对每组参数重新编译,结果可能会大不相同(选择不同的局部变量类型,不同的函数重载)。专业化使真正强大。
使用泛型,代码只编译一次,并且在不知道最终参数的情况下完成重载决策。因此,当您调用Write(value)
时,编译器唯一知道的就是
value
可以转换为Object^
,因为一切都可以value
派生自ValueType
,因为您的约束告诉它不幸的是,仅使用该信息,编译器无法找到可以使用的Write
重载。
似乎您希望Write(bool)
T
bool
时使用Write(int)
,T
int
BinaryWrite::Write
时使用{{1}},依此类推。模板会像那样工作。泛型没有。
您的选择是: