Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
为什么在使用auto_ptr样式类访问结构成员时会得到“未识别标识符”? < >我使用C++模板来访问内存保存偏好。内存由句柄引用。为了锁定/解锁这个内存,我编写了一个类似auto_ptr的类模板。当我不想访问其中一个成员时,编译器会发出一个“未知标识符错误” typedef struct { int value ; } PREFS ; template <class T> class PluginMem { private : T *ptr ; public : T * operator -> ( ) { return( ptr ) ; } } ; typedef PluginMem<PREFS> Prefs ; class PluginContext { public : template <class T> T * getNamedPreferences ( const char *prefsname ) ; } ; static void test() { PluginContext ctx ; Prefs *p ; p = ctx.getNamedPreferences<Prefs>( "test" ) ; /* * unidentified identifier 'value' */ p->value = 0 ; }_C++_Templates - Fatal编程技术网

为什么在使用auto_ptr样式类访问结构成员时会得到“未识别标识符”? < >我使用C++模板来访问内存保存偏好。内存由句柄引用。为了锁定/解锁这个内存,我编写了一个类似auto_ptr的类模板。当我不想访问其中一个成员时,编译器会发出一个“未知标识符错误” typedef struct { int value ; } PREFS ; template <class T> class PluginMem { private : T *ptr ; public : T * operator -> ( ) { return( ptr ) ; } } ; typedef PluginMem<PREFS> Prefs ; class PluginContext { public : template <class T> T * getNamedPreferences ( const char *prefsname ) ; } ; static void test() { PluginContext ctx ; Prefs *p ; p = ctx.getNamedPreferences<Prefs>( "test" ) ; /* * unidentified identifier 'value' */ p->value = 0 ; }

为什么在使用auto_ptr样式类访问结构成员时会得到“未识别标识符”? < >我使用C++模板来访问内存保存偏好。内存由句柄引用。为了锁定/解锁这个内存,我编写了一个类似auto_ptr的类模板。当我不想访问其中一个成员时,编译器会发出一个“未知标识符错误” typedef struct { int value ; } PREFS ; template <class T> class PluginMem { private : T *ptr ; public : T * operator -> ( ) { return( ptr ) ; } } ; typedef PluginMem<PREFS> Prefs ; class PluginContext { public : template <class T> T * getNamedPreferences ( const char *prefsname ) ; } ; static void test() { PluginContext ctx ; Prefs *p ; p = ctx.getNamedPreferences<Prefs>( "test" ) ; /* * unidentified identifier 'value' */ p->value = 0 ; },c++,templates,C++,Templates,我希望能够在这里将p->value更改为零。这应该可以做到: (*p)->value 您的p只是一个指针,您需要首先取消对它的引用,以便可以使用类运算符-> 注意-如果要跳过取消引用部分,则需要按值复制Prefs,并在不使用诸如Prefs p之类的指针表示法的情况下使用它。请注意,您通常编写auto_ptr baz而不是auto_ptr*bazauto_ptr是过时的东西。如果要进行比较,那么应该使用unique_ptr或shared_ptr。最初我尝试了类似于p=ctx.getname

我希望能够在这里将p->value更改为零。

这应该可以做到:

(*p)->value
您的p只是一个指针,您需要首先取消对它的引用,以便可以使用类运算符->


注意-如果要跳过取消引用部分,则需要按值复制Prefs,并在不使用诸如Prefs p之类的指针表示法的情况下使用它。请注意,您通常编写auto_ptr baz而不是auto_ptr*baz

auto_ptr是过时的东西。如果要进行比较,那么应该使用unique_ptr或shared_ptr。最初我尝试了类似于p=ctx.getnamedreferences的方法,但编译器抱怨模板定义不正确。如果我将Prefs*p更改为Prefs p,ctx.getnamedreferences需要返回一个T&correct?@EugèneBindels不,您只需按值复制它即可返回T。T中只有一个字段是指针类型,复制它的成本并不比复制指针本身高。使用指针指向智能指针没有多大意义。谁拥有最上面的指针?你说的“最上面的指针”是什么意思?因为你有一个指向智能指针的指针,最上面的指针将是第一个出现在Prefs*p链中的指针。下一个指针将是运算符->