C++ make.natvis show SmartPointer<;T>;作为静态演员<;T*>;(无效*)
C++ make.natvis show SmartPointer<;T>;作为静态演员<;T*>;(无效*),c++,visual-studio,visual-studio-2015,natvis,C++,Visual Studio,Visual Studio 2015,Natvis,E2是一个智能指针 要在鼠标悬停在工具提示上方时启用工具提示E2->aField,我可以创建.natvis如下:- .cpp class Blank{ public: int sss=5; }; template<class T> class E2 { public: T* operator->(){ return static_cast<T*>(atDerive); } T* atDerive; /
E2
是一个智能指针
要在鼠标悬停在工具提示上方时启用工具提示E2->aField
,我可以创建.natvis
如下:-
.cpp
class Blank{
public: int sss=5;
};
template<class T> class E2 {
public: T* operator->(){
return static_cast<T*>(atDerive);
}
T* atDerive; //#
};
int main(){
Blank k2; k2.sss=32;
E2<Blank> e2;
e2.atDerive=&k2;
e2->sss=4;
}
class E1{
public: void* atBase=nullptr; //#
};
template<class T> class E2 : public E1{
public: T* operator->(){
return static_cast<T*>(atBase);
}
};
int main(){
Blank k; k.sss=31;
E2<Blank> e2;
e2.atBase=&k;
e2->sss=4;
}
.natvis(不工作-不显示工具提示)
atBase
问题:
如何修改
.natvis
以使工具提示能够显示基类(E1
)中的void*
?将类型强制转换从void*
添加到模板类型T
(可以在.natvis文件中以$T1的形式获得)
($T1*)atBase
{($T1*)atBase}
不,没有什么特别的:在第一个E2
中使用类型指针,在第二个void*
中使用类型指针,但编译器无法从void*
派生嵌套(实)类型,所以需要执行一些类型转换来告诉编译器要使用什么类型。
class E1{
public: void* atBase=nullptr; //#
};
template<class T> class E2 : public E1{
public: T* operator->(){
return static_cast<T*>(atBase);
}
};
int main(){
Blank k; k.sss=31;
E2<Blank> e2;
e2.atBase=&k;
e2->sss=4;
}
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">atBase</SmartPointer>
</Type>
<Type Name="E2<*>">
<SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
<DisplayString>{($T1*)atBase}</DisplayString>
</Type>