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