我有一个静态类方法,需要访问指针MyTypePointer,因此必须声明为static。由于它是一个模板类,我必须将方法放在头文件中,但我不能在头文件中定义MyTypePointer。
因为未声明MyTypePointer,所以我得到“undefined Reference”错误。如何使这个工作/声明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
}
非常感谢。
答案 0 :(得分:9)
这是一个完整参考的迟到答案,因为这个问题与另一个问题相关联。
静态字段声明但已定义的最小破坏示例可能是:
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;
}
答案 1 :(得分:6)
在模板定义中,static MyType *MyTypePointer;
声明一个对象。您仍然必须在模板类定义之外定义:
template <class A, class B>
typename PathfindingClass<A, B>::MyType*
PathfindingClass<A, B>::MyTypePointer;
答案 2 :(得分:3)
您仍然可以定义模板成员并为所有需要的特化显式实例化它。如果你坚持让一个类模板的state
数据成员大致需要它。
鉴于全局变量共享各种问题,包括初始化期间的依赖性问题,您最好用static
成员函数包装数据成员:
template <typenane T>
class foo {
// ...
static X*& member() {
static X* rc = ...;
return rc;
}
};
第一次调用函数时会初始化局部变量,并且可以安全地使用对它的引用。这种方法也适用于模板。
请注意,我仍然建议避免使用全局变量!它们在长期使用中造成许多问题,使用它们的短期利益是巨额债务,通常不会得到回报。