从静态方法访问模板类的静态成员的“未定义引用”

我有一个静态类方法,需要访问指针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
}

非常感谢你。


在模板定义中, static MyType *MyTypePointer; 声明一个对象。 您仍需要在模板类定义之外定义它:

template <class A, class B>
typename PathfindingClass<A, B>::MyType*
PathfindingClass<A, B>::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;
}

您仍然可以定义模板成员并为所有需要的专业化明确地实例化它。 如果你坚持要有一个类模板的state数据成员,这大概是需要的。

鉴于全局变量共享各种问题,包括初始化期间的依赖关系问题,您会更好,可以通过static成员函数包装数据成员:

template <typenane T>
class foo {
    // ...
    static X*& member() {
        static X* rc = ...;
        return rc;
    }
};

第一次调用函数时可以初始化本地变量,并且可以安全地使用该函数的引用。 这种方法也适用于模板。

请注意,我仍然建议避免全局变量! 它们造成很多问题,长期和短期的利益使用它们是巨大的债务,通常没有得到回报。

链接地址: http://www.djcxy.com/p/51563.html

上一篇: "undefined reference" to static member of template class accessed from static method

下一篇: Can't link GLFW3: undefined references