Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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
C++ -类型绑定绑定解析的正确方法?_C++ - Fatal编程技术网

C++ -类型绑定绑定解析的正确方法?

C++ -类型绑定绑定解析的正确方法?,c++,C++,我有以下代码片段: 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

我有以下代码片段:

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)
     {}
  };
}
并希望编译器根据使用的名称空间和Koenig查找选择正确的RM8类型。 在没有重新绑定或解决正确类型的特征的情况下,他们是更好的方法吗

我可以使X86::RM8和X64::RM8具有相同的类型,但我不想为此而奋斗

谢谢 马丁

请注意,不能同时使用两个using指令,因为这会使MOV_指令不明确

此外,我将_Traits更改为Traits,因为以下划线开头,后跟大写字母的标识符保留给实现。您可能会从某个头吸引一个宏来践踏您的代码,并导致非常奇怪的编译器错误

还有一条路

}); }

int main{ 使用名称空间X86

MOV_指令i; i、 movRM8,IMM8; 返回0; }

using namespace X86 | X64

MOV_Instruction i;
i.mov(RM8(), IMM8());
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;
}
namespace X86X64 { struct IMM8 {}; }

namespace X86 { using namespace X86X64; typedef struct RM8 {} RM8;

template < class T = RM8 >
struct MOV_Instruction
{
    typedef T RM8;

    void mov(const RM8& rm, const IMM8& imm)
    {}
};
 void mov(const RM64& rm, const IMM8& imm)
 {}