在主文件中,未定义对类中静态成员变量的引用

时间:2019-11-16 18:50:21

标签: c++ class static static-methods undefined-reference

我使此标头包含一个类,用于确定最大的2分母(或多个数字,具体取决于所使用的函数)。编译时,出现以下错误:

,,cmmdc.h: In static member function 'static void teo::cmmdc<T>::CMMDC(T*, T&)':

  cmmdc.h:55:13: error: 'size_t' was not declared in this scope

         size_t  ____sz = sizeof( ____num ) / sizeof( ____num [0] ) + 1 ;
         ^
     

编辑:此错误已解决。

在我有一个用size_t声明的变量的任何地方都会出现此错误。这是完整的标头代码:

#ifndef TEO_CMMDC_H_
#define TEO_CMMDC_H_
#include <cstddef>

namespace teo
{
    template <class T>
    class cmmdc
    {
    public:
        enum Algorithm
        {
            Euclid, Nichomahus
        };
        static Algorithm m_type;

    private:
        static T m_x, m_y, m_r;

    public:
        cmmdc()
        {

        }
        static void CMMDC (T a, T b, T& result)
        {
            if(m_type==Euclid)
            {
                for(; b; m_x=a%b, a=b, b=m_x);
                result=a;
            }
            else
            {
                for(; a!=b; (a>b?a=a-b:b=b-a));
                result=a;
            }
        }
        static void CMMDC(T& a, T b)
        {
            if(m_type==Euclid)
                for(; b; m_x=a%b, a=b, b=m_x);
            else
                for(; a!=b; (a>b?a=a-b:b=b-a));
        }
        static T CMMDC_R(T a, T b)
        {
            if(m_type==Euclid)
                for(; b; m_x=a%b, a=b, b=m_x);
            else
                for(; a!=b; (a>b?a=a-b:b=b-a));
            return a;
        }
        static void CMMDC(T * num, T& res)
        {
            size_t sz=sizeof(num)/sizeof(num[0])+1;
            if(m_type==Euclid)
            {
                for(size_ti=0;i<sz;i++)
                {
                    (!m_x?m_x=num[i-1],m_y=num[i]:m_y=num[i]);
                    for(; m_y; m_r=m_x%m_y, m_x=m_y, m_y=m_r);
                }
            }
            else
            {
                for(size_ti=0;i<sz;i++)
                {
                    (!m_x?m_x=num[i-1],m_y=num[i]:m_y=num[i]);
                    for(; m_x!=m_y; (m_x>m_y?m_x=m_x-m_y:m_y=m_y-m_x));
                }
            }
            res=m_x;
        }
        static T CMMDC(T * num)
        {
            size_t sz=sizeof(num)/sizeof(num[0])+1;
            if(m_type==Euclid)
            {
                for(size_ti=0;i<sz;i++)
                {
                    (!m_x?m_x=num[i-1],m_y=num[i]:m_y=num[i]);
                    for(; m_y; m_r=m_x%m_y, m_x=m_y, m_y=m_r);
                }
            }
            else
            {
                for(size_ti=0;i<sz;i++)
                {
                    (!m_x?m_x=num[i-1],m_y=num[i]:m_y=num[i]);
                    for(; m_x!=m_y; (m_x>m_y?m_x=m_x-m_y:m_y=m_y-m_x));
                }
            }
            return m_x;
        }
    };
} // namespace teo

#endif /* TEO_CMMDC_H_ */

这是main.cpp文件:

#include <iostream>
#include "cmmdc.h"

int main() 
{
    int a, b, res;
    std::cin>>a>>b;
    teo::cmmdc<int>::m_type=teo::cmmdc<int>::Algorithm::Euclid;
    teo::cmmdc<int>::CMMDC(a, b, res);
    std::cout<<res;
}

修复了size_t错误之后,此错误发生在main.cpp中:

,,C:\Users\...:main.cpp:(.rdata$.refptr._ZN3teo5cmmdcIiE3m_xE[.refptr._ZN3teo5cmmdcIiE3m_xE]+0x0): undefined reference to 'teo::cmmdc<int>::m_x'
C:\Users\...:main.cpp:(.rdata$.refptr._ZN3teo5cmmdcIiE6m_typeE[.refptr._ZN3teo5cmmdcIiE6m_typeE]+0x0): undefined reference to 'teo::cmmdc<int>::m_type'
collect2.exe: error: ld returned 1 exit status
     

编辑:包括确实解决了我的第一个问题,但第二个错误仍然存​​在。   编辑:问题已解决,感谢您指出重复。这些是我在课程结束后添加的代码行,以解决此问题:

    template<class T>
    typename cmmdc<T>::Algorithm cmmdc<T>::m_type;
    template<class T>
    T cmmdc<T>::m_x;
    template<class T>
    T cmmdc<T>::m_y;
    template<class T>
    T cmmdc<T>::m_r;

谢谢您的帮助!

0 个答案:

没有答案