简体   繁体   中英

vtable C++ error after implementing pure virtual method

I have a pure virtual function defined in a class as below:

   template <typename T>
   class PositioningMethod {

   public:
       virtual ApproximatePosition *getPosition(std::list<T*> &observedRadioSignals) = 0;
   };

and implementing it in ParticleFilter as below:

class ParticleFilter:public PositioningMethod<T> {

           public:
               virtual ApproximatePosition *getPosition(std::list<T*> &observedRadioSignals) {
              /*Some code and return*/
           return ApproximatePosition::from(xxxx, xxxx, xxxx());

           }
};

but getting below errors:

    "ParticleFilter<KnownBluetoothBeacon<CartesianLocation>, RadioProximity<BluetoothBeacon>
   >::getPosition(std::__1::list<RadioProximity<BluetoothBeacon>*, std::__1::allocator<RadioProximity<BluetoothBeacon>*> >&)",    referenced from:
             vtable for RadioProximityParticleFilter in lib.a(RadioProximityParticleFilter.o)
         "ParticleFilter<KnownBluetoothBeacon<CartesianLocation>, RadioProximity<BluetoothBeacon>
   >::ParticleFilter(std::__1::list<KnownBluetoothBeacon<CartesianLocation>,    std::__1::allocator<KnownBluetoothBeacon<CartesianLocation> > >&,    double)", referenced from:
             RadioProximityParticleFilter::RadioProximityParticleFilter(std::__1::list<KnownBluetoothBeacon<CartesianLocation>,    std::__1::allocator<KnownBluetoothBeacon<CartesianLocation> > >&,    double) in lib.a(RadioProximityParticleFilter.o)
       ld: symbol(s) not found for architecture arm64

I know vtable error generally occurs on non-implementing pure virtual functions, but in my case it is same. Any idea where I may be wrong?

Note: The above errors I am getting while integrating my C++ code with objective C in iOS. While in C++ its working fine

This below line is causing the errors in ViewController.mm:

RadioProximityParticleFilter *obj = new RadioProximityParticleFilter (*asList,50);

I completed your code to use it in my MS VS 2013 test project, and it just works - here is the full listing:

#include <iostream>
#include <list>

using namespace std;

class ApproximatePosition
{
public:
    static ApproximatePosition *from( int a, int b, int c)
    {
        cout << "from called." << endl;
        return NULL;
    }
};

class ListElem{};

template <typename T>
class PositioningMethod 
{
    public:
        virtual ApproximatePosition *getPosition(std::list<T*> &observedRadioSignals) = 0;
};

template <typename T>
class ParticleFilter :public PositioningMethod<T>
{

    public:
        virtual ApproximatePosition *getPosition(std::list<T*> &observedRadioSignals)
        {
            /*dummy input and return*/
            int a = 0, b = 0, c = 0;
            cout << "getPosition called." << endl;
            return ApproximatePosition::from( a, b, c );// xxxx, xxxx, xxxx());         
        }
};

int main()
{
    PositioningMethod<ListElem> *pm = new ParticleFilter<ListElem>();

    std::list<ListElem*> l;
    pm->getPosition( l );

}

The output is:

getPosition called.
from called.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM