[英]confused defining a static C++ template class member
我正在尝试使用静态成员定义模板类,以便模板的每个特化都有自己的静态成员。 此外,静态成员是类本身的一个对象(用作链接列表的标记。)我不确定这甚至可以在C ++中合法地完成,但如果是这样,我正在喋喋不休而不是得到它完成了。
一个小样本,展示了我想要实现的目标:
template<class E> class LL {
static LL<E> l;
};
class A {
};
template<typename A>
typename <class A>LL LL<A>::l;
当我用g ++(版本4.8.1)编译时,它报告:
g++ -Wall -o t-static.o t-static.cpp
t-static.cpp:9:14: error: expected nested-name-specifier before ‘<’ token
typename <class A>LL LL<A>::l;
^
t-static.cpp:9:14: error: expected unqualified-id before ‘<’ token
(错误在文件的列表行中。)
我恐怕我并不真正理解诊断或类型名称,并且已经在这一段时间内一直在抨击,唯一的结果是我可以获得不同的错误消息。 我找到了一堆处理这个问题的问题,但没有一个能帮助我找到解决方案。
最后,我希望解决方案不是特定于特定的g ++版本,因为此代码的最终目标是Arduino,它目前使用g ++ v4.3.2并且不支持C ++ 11(或者不使用C + +11)。
谢谢您的帮助。
尝试在类模板中使用static
成员会让您感到悲伤,因为您需要显式实例化它们。 要快速解决当前问题:您只需要使用正确的语法定义。
template <typename E>
static LL<E> LL<E>::l;
但是,如果编译器最终在多个转换单元中实例化此数据成员,您将获得多个定义的符号。 由于各种原因,您最好将对象嵌套到函数中并从那里返回引用:
template <typename E>
class LL {
static LL<E>& l();
// ...
};
template <typename E>
LL<E>& LL<E>::l() { static LL<E> rc; return rc; }
也就是说,你应该寻求不使用任何全局对象! 它们往往会导致很多问题,即使它们的访问受限于从给定的类中完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.