jeudi 18 octobre 2018

How to acess structure from an instance of templated class implementing an inteface

I basically have 2 questions based on my below code:

#include <iostream>
#include <memory>

class Interface
{
public:
    virtual ~Interface() = default;
    virtual int GetOperation() const = 0;
};

template <typename T>
class Util : public Interface
{
   public:
    Util ();
    virtual ~Util (){}
    virtual int GetOperation() const override;
    T GetFields() const;
   private:
    int index;
    int operation;
    T mfield;
};

class A 
{
   public:
    A(){}
    int noOfPkts;
};
template <class T>
Util<T>::Util()
{
}

template <class T>
int Util<T>::GetOperation() const
{
    return operation;
}
template <class T>
T Util<T>::GetFields() const
{
    return mfield;
}


int main()
{
auto sn = std::make_unique <Util<A>>();
//sn->GetFields().noOfPkts = 10;
}

If I uncomment the code I get compilation error:

$ c++ -std=c++14 try51.cpp
try51.cpp: In function 'int main()':
try51.cpp:51:26: error: using temporary as lvalue [-fpermissive]
 sn->GetFields().noOfPkts = 10;

Secondly I actually want to implement within the interface a method that will return the template class fields structure like:

#include <iostream>
#include <memory>

class Interface
{
public:
    virtual ~Interface() = default;
    virtual int GetOperation() const = 0;
    virtual struct Fields* GetFields() const = 0;
};

template <typename T>
class Util : public Interface
{
   public:
    Util ();
    virtual ~Util (){}
    virtual int GetOperation() const override;
    virtual struct Fields* GetFields() const override;
   private:
    int index;
    int operation;
    T mfield;
};

class A 
{
   public:
    A(){}
    struct Fields {
        int noOfPkts;
        } f;
};
template <class T>
Util<T>::Util()
{
}

template <class T>
int Util<T>::GetOperation() const
{
    return operation;
}
template <class T>
struct Fields* Util<T>::GetFields() const
{
    return &mfield.f;
}


int main()
{
auto sn = std::make_unique <Util<A>>();
//sn->GetFields().noOfPkts = 10;
}

But I get below compilation error -

$ c++ -std=c++14 try51.cpp
try51.cpp: In instantiation of 'Fields* Util<T>::GetFields() const [with T = A]':
try51.cpp:55:1:   required from here
try51.cpp:47:17: error: cannot convert 'const A::Fields*' to 'Fields*' in return
  return &mfield.f;

How can I fix both the issue?

Aucun commentaire:

Enregistrer un commentaire