VS.NET - non-type template classes with FLOAT

Hi,

I am having a problem compiling one of my projects (VS.NET, project imported from VC6), because there is a problem with how VS.NET handles FLOATS in non-type template classes. I have checked out MSDN : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/C2993.asp BUT no joy as it says if it is a class template which mine is, there is no easy workaround.

So to my question, does anyone know of a way to solve this ? I am thinking that i will have to write a new class to include the float parameters only, and take them out of the template class. Is this the correct way ? For your info, below is my template class.

template<class T, TypeID_gem_t TypeID, T Invalid>
class CGEM_ArrayItem : public CGEM_DataItem
{      
      LPCSTR      m_pszName;
      T*            m_pVal;
      size_t      m_cElemCount;
      TypeID_gem_t m_type;

 public:
       CGEM_ArrayItem(const TGEM_DATA_DEF& DataDef)  
             : m_cElemCount(DataDef.ItemCount),

              m_type(TypeID)
      {
            m_pVal = new T[m_cElemCount];

            if(m_pVal == 0)
                  m_cElemCount = 0;
            else
                  for(int i = 0; i < m_cElemCount; i++)
                              m_pVal[i] = Invalid;

            m_pszName = ::_strdup(DataDef.pszItemName);

            TGEM_DATA d;
            d.val = DataDef.IniVal;
            d.ParType = DataDef.ParType;

            Set(d);
      }

      ~CGEM_ArrayItem()
      {
            delete[] m_pVal;
            
            ::free(m_pszName);
      }


      static SAFEARRAY* GetSafeArray(const TGEM_DATA& data)
      {
            switch(data.ParType)
            {
                  case GEM_I8_ARRAY:      return data.val.I8_array;
                  case GEM_I16_ARRAY:      return data.val.I16_array;                  
                  case GEM_I32_ARRAY:      return data.val.I32_array;
                  case GEM_I64_ARRAY:      return data.val.I64_array;

                  case GEM_SF_ARRAY:      return data.val.SF_array;      //singlefloat      
                  case GEM_DF_ARRAY:      return data.val.DF_array;      //doublefloat            

                  case GEM_U8_ARRAY:      return data.val.U8_array;                  
                  case GEM_U16_ARRAY:      return data.val.U16_array;                  
                  case GEM_U32_ARRAY:      return data.val.U32_array;                  
                  case GEM_U64_ARRAY:      return data.val.U64_array;                  
                  case GEM_B_ARRAY:      return data.val.B_array;                  

                  default:
                        ATLASSERT(false);
                        return NULL;
            }            
      }


      HRESULT Set(const TGEM_DATA& data)
      {
            HRESULT hr = E_INVALIDARG;
            SAFEARRAY *psa = GetSafeArray(data);

            if(psa != NULL)            
            {
                  ULONG size = sizeof T;
                  ATLASSERT(SafeArrayGetElemsize(psa) == sizeof T);
                  
                  void *pSrc;
                  hr = SafeArrayAccessData(psa, &pSrc);

                  if(SUCCEEDED(hr))
                  {
                        long plUbound;

                        hr = SafeArrayGetUBound(psa, 1, &plUbound);

                        if(SUCCEEDED(hr) && ++plUbound == m_cElemCount)
                              memcpy(m_pVal, pSrc, plUbound * sizeof T);
                        else
                              hr = E_INVALIDARG;

                        SafeArrayUnaccessData(psa);
                  }
            }
                  
            return hr;
      }
      


      TypeID_gem_t      GetType() { return m_type; }
      Data_gem_t*            GetData() { return m_pVal; }
      LPCSTR                  GetName() { return m_pszName; }
      Integer32_gem_t GetElementCount() { return m_cElemCount; }

      void Invalidate()
      {
            if(m_pVal)
            {                  
                  for(int i = 0; i < m_cElemCount; i++)
                  {
                        m_pVal[i] = 0;
                  }
            }
      }
};

Any help would be most appreciated in this porting exercise from VS6 to VS.NET C++.

Kind Regards
Jon.




upliftinAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

rstaveleyCommented:
I think you have to pass it as a constructor parameter :-(

e.g.
--------8<--------
#include <iostream>

template<class T> class TC {
        const T initialiser;
public:
        TC(T initialiser) : initialiser(initialiser) {}
        void print() const { std::cout << "Initialiser is " << initialiser << '\n';}
};

int main()
{
        TC<double> tc(123.456);
        tc.print();
}
--------8<--------

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
tinchosCommented:
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: rstaveley {http:#9734842}

Please leave any comments here within the next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Tinchos
EE Cleanup Volunteer
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.