Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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++ make.natvis show SmartPointer<;T>;作为静态演员<;T*>;(无效*)_C++_Visual Studio_Visual Studio 2015_Natvis - Fatal编程技术网

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&lt;*&gt;">
    <SmartPointer Usage="Minimal">atBase</SmartPointer>
  </Type>
<Type Name="E2&lt;*&gt;">
  <SmartPointer Usage="Minimal">($T1*)atBase</SmartPointer>
  <DisplayString>{($T1*)atBase}</DisplayString>
</Type>