"undefined reference"从静态方法访问的模板类的静态成员
"undefined reference" to static member of template class accessed from static method
我有一个静态类方法,它需要访问指针MyTypePointer,因此必须声明为静态。由于它是一个模板类,我必须将方法放在头文件中,但我不能在头中定义MyTypePointer。
因此,由于没有声明MyTypePointer,我得到了"未定义引用"错误。我如何使此项工作/声明MyTypePointer。
myclass.h
template <typename A, typename B>
class PathfindingClass {
typedef std::vector<GenericEdgeClass<A, B>*> MyType;
static MyType *MyTypePointer;
};
template <typename A, B>
void MyClass<A, B>::MyMethod(int x, int y) {
//do something with MyTypePointer
}
非常感谢。
这是一个完整参考的迟交答案,因为这个问题被链接为另一个问题的参考。
声明但未定义的静态字段的最小破坏示例可以是:
template<typename T>
class A
{
public:
static T val;
static void init()
{
val=0;
}
};
int main()
{
// A::init();
A<double>::init();
return 0;
}
修复方法只是在类定义之后定义静态字段:
template<typename T>
class A
{
public:
static T val;
static void init()
{
val=0;
}
};
template<typename T> T A<T>::val; // only change here
int main()
{
// A::init();
A<double>::init();
return 0;
}
在模板定义中,static MyType *MyTypePointer;
声明一个对象。您仍然需要在模板类定义之外定义它:
template <class A, class B>
typename PathfindingClass<A, B>::MyType*
PathfindingClass<A, B>::MyTypePointer;
您仍然可以定义模板成员,并为所有需要的专业化显式实例化它。如果您坚持在类模板中有一个state
数据成员,这大致就是所需要的。
考虑到全局变量共享各种各样的问题,包括初始化期间的依赖性问题,您最好使用static
成员函数包装数据成员:
template <typenane T>
class foo {
// ...
static X*& member() {
static X* rc = ...;
return rc;
}
};
本地变量在第一次调用函数时初始化,并且可以安全地使用对它的引用。这种方法也适用于模板。
注意,我仍然建议避免全局变量!它们会在长期和短期内造成许多问题。使用它们的好处是一笔巨大的债务,通常无法偿还。
相关文章:
- 如何在复杂继承中访问静态成员变量
- decltype:使用指针访问类的静态成员
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 访问控制和静态成员
- 从静态成员函数访问私有非静态类变量 - C++
- GCC 允许访问私有静态成员
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 创建类型列表并访问每种类型的静态成员?
- 常量表达式中的静态成员访问
- C++ 静态成员变量 - 文件之间的访问
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- 使用静态成员函数访问静态数据成员
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 将typeID转换为静态成员访问(C )的命名空间
- 在没有显式作用域的情况下无法访问模板基类的静态成员
- 为什么我得到带有受保护静态成员的 C2248(无法访问的成员)
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- C 从实现文件中访问私有静态成员
- 静态成员函数访问静态私有变量时的链接器错误
- 访问指定为私有的基类的公共静态成员