我正在C ++中定义3个类,并试图最大程度地利用奇怪的重复模板模式(CRTP)。我正在使用VS2017。
代码:
`
template<typename Outer>
class OuterClass <Outer, uint32_t> {
using datatype = uint32_t;
static uintptr_t GetAddr(void const volatile* const ptr) {
auto const addr1 = get_addr();
auto const addr_virtual = ptr;
auto const baseAddr = Outer::base_addr;
uintptr_t const addressCalcd = uintptr_t(baseAddr) + uintptr_t( addr_virtual - addr1 );
return addressCalcd;
};
};
template<typename Outer>
class OuterClass <Outer, uint64_t> {
using datatype = uint64_t;
static uintptr_t GetAddr(void const volatile* const ptr) {
auto const addr1 = get_addr();
auto const addr_virtual = ptr;
auto const baseAddr = Outer::base_addr;
uintptr_t const addressCalcd = uintptr_t(baseAddr) + uintptr_t( addr_virtual - addr1 );
return addressCalcd;
};
};
template<typename Inner, typename Outer>
struct InnerClass {
GetAddVal CastVl() const volatile {
uint32_t addrl = uint32_t(Outer::GetAddr(static_cast<const volatile R*>(this)));
return VAL_CAST{ addrl };
}
operator Outer::datatype() const volatile {
return RegBlock<Outer, Outer::datatype>::readReg(*this);
}
operator Outer::datatype() const {
return RegBlock<Outer, Outer::datatype>::readReg(*this);
}
void operator=(Inner const & x) volatile;
void operator=(const Outer::datatype x) volatile;
};
错误在InnerClass中。首先,
uint32_t addrl = uint32_t(Outer::GetAddr(static_cast<const volatile R*>(this)));
很好。我可以引用静态类Outer :: GetAddr没问题。
但是,我不能引用typedef
operator Outer::datatype() const volatile {
错误:C2833“操作员限定名”未被识别为操作员或类型
这也是错误:
void operator=(const Outer::datatype x) volatile;
C2805二进制“运算符=”参数太少。
为什么我可以使用::而不是typedef'd引用静态类?我应该考虑在“外部类”中嵌套“内部类”吗?理想情况下,我根本不需要嵌套类。