与涉及 shared_ptr 列表的表达式相关的编译器错误
Compiler error related to expression involving list of shared_ptr
我有两个模板声明如下:
template<typename T>
class A{
public:
T& getData();
//rest of public
private:
T& data;
//rest of private
};
template<typename T1, typename T2>
class B{
public:
using typAContainter = class std::list<shared_ptr<A<T1>>>;
B(int, T2&);
//rest of public
private:
typeAContainer C;
//rest of private
};
在 B 的构造函数定义中,我使用以下表达式(用于调试):
template<typename T1, typename T2> B<T1, T2>::B(int I, data& rData){
#ifdef DEBUG
auto iter = C.begin();
std::cout << (*(iter).get())->getData() << std::endl;
#endif
}
对于表达式 (*(iter).get())->getData()
我得到以下编译错误:
error: no member named 'get' in 'std::__1::
__list_iterator<std::__1::shared_ptr<A<std::__1::basic_string<char> > >, void *>'
我的理解是*iter
应该给我一个shared_ptr<A<T1>>
类型的表达式。同样调用 get() 方法应该获取类型为 A<T1>*
的表达式(指向 A<T1>
的指针),在该表达式上我尝试使用 [=20= 调用 getData()
方法] 操作员。我在构造上述表达式时也注意了运算符的优先级。
显然,我的理解存在一些缺陷。如果有人能指出这一点,我将不胜感激。
PS
我认为您误读了一些关于 operator precedence 的内容,并且错放了 *(iter)
中的括号。
表达式 *(iter).get()
等于 *((iter).get())
(这又等于 *(iter.get())
)。也就是说,您尝试在迭代器上使用 .
成员访问运算符,然后取消引用 get()
returns。这两者通常都不起作用。
iter->get()
或 (*iter).get()
。
我有两个模板声明如下:
template<typename T>
class A{
public:
T& getData();
//rest of public
private:
T& data;
//rest of private
};
template<typename T1, typename T2>
class B{
public:
using typAContainter = class std::list<shared_ptr<A<T1>>>;
B(int, T2&);
//rest of public
private:
typeAContainer C;
//rest of private
};
在 B 的构造函数定义中,我使用以下表达式(用于调试):
template<typename T1, typename T2> B<T1, T2>::B(int I, data& rData){
#ifdef DEBUG
auto iter = C.begin();
std::cout << (*(iter).get())->getData() << std::endl;
#endif
}
对于表达式 (*(iter).get())->getData()
我得到以下编译错误:
error: no member named 'get' in 'std::__1::
__list_iterator<std::__1::shared_ptr<A<std::__1::basic_string<char> > >, void *>'
我的理解是*iter
应该给我一个shared_ptr<A<T1>>
类型的表达式。同样调用 get() 方法应该获取类型为 A<T1>*
的表达式(指向 A<T1>
的指针),在该表达式上我尝试使用 [=20= 调用 getData()
方法] 操作员。我在构造上述表达式时也注意了运算符的优先级。
显然,我的理解存在一些缺陷。如果有人能指出这一点,我将不胜感激。
PS
我认为您误读了一些关于 operator precedence 的内容,并且错放了 *(iter)
中的括号。
表达式 *(iter).get()
等于 *((iter).get())
(这又等于 *(iter.get())
)。也就是说,您尝试在迭代器上使用 .
成员访问运算符,然后取消引用 get()
returns。这两者通常都不起作用。
iter->get()
或 (*iter).get()
。