我有以下代码片段:
namespace X86X64
{
struct IMM8 {};
}
namespace X86
{
using namespace X86X64;
struct RM8 {};
template <class _Traits>
struct MOV_Instruction
{
typedef typename _Traits::RM8 RM8;
void mov(const RM8& rm, const IMM8& imm)
{}
};
}
namespace X64
{
using namespace X86X64;
struct RM8 {};
struct RM64 {};
struct Traits
{
typedef RM8 RM8;
};
struct MOV_Instruction : public X86::MOV_Instruction<Traits>
{
using X86::MOV_Instruction<Traits>::mov;
void mov(const RM64& rm, const IMM8& imm)
{}
};
}
当我不使用特征时,我得到一个错误,编译器在实例化 MOV_Instruction 时找不到任何将 X64::RM8 转换为 X86::RM8 的运算符。
命名空间 X86 和 X64 必须有自己独立的 RM8 类型,具有不同的基础类型。
我只想使用:
using namespace X86 | X64
MOV_Instruction i;
i.mov(RM8(), IMM8());
并希望编译器根据使用的命名空间和 Koenig 查找选择正确的 RM8 类型。 如果没有特征来重新绑定(bind)或解析正确的类型,他们是否是更好的方法来做到这一点?
我可以让 X86::RM8 和 X64::RM8 成为同一类型,但我不想为此努力。
谢谢 马丁
最佳答案
This compiles fine using VC9:
namespace X86X64 {
struct IMM8 {};
}
namespace X86 {
using namespace X86X64;
struct RM8 {};
template <class Traits>
struct MOV_Instruction {
typedef typename Traits::RM8 RM8;
void mov(const RM8& rm, const IMM8& imm) {}
};
}
namespace X64 {
using namespace X86X64;
struct RM8 {};
struct RM64 {};
struct Traits {
typedef RM8 RM8;
};
struct MOV_Instruction : public X86::MOV_Instruction<Traits> {
using X86::MOV_Instruction<Traits>::mov;
void mov(const RM64& rm, const IMM8& imm) {}
};
}
int main()
{
//using namespace X86;
using namespace X64;
MOV_Instruction i;
i.mov(RM8(), IMM8());
return 0;
}
请注意,不能同时使用 using 指令,因为那样会使 MOV_Instruction
含糊不清。
此外,我将 _Traits
更改为 Traits
,因为以下划线开头,后跟大写字母的标识符是为实现保留的。 (您可能会从某些 header 中吸引一个宏来破坏您的代码并导致非常奇怪的编译器错误。)
关于C++ - 类型重新绑定(bind)解析的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594507/