簡體   English   中英

實現純虛擬方法后,vtable C ++錯誤

[英]vtable C++ error after implementing pure virtual method

我在一個類中定義了一個純虛函數,如下所示:

   template <typename T>
   class PositioningMethod {

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

並在ParticleFilter中實現它,如下所示:

class ParticleFilter:public PositioningMethod<T> {

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

           }
};

但出現以下錯誤:

    "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

我知道vtable錯誤通常發生在未實現的純虛函數上,但就我而言,它是相同的。 知道我哪里錯了嗎?

注意: 在將C ++代碼與iOS中的目標C集成時遇到的上述錯誤。 雖然在C ++中可以正常工作

下面的這一行導致ViewController.mm中的錯誤:

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

我完成了您的代碼,可以在我的MS VS 2013測試項目中使用它,並且它可以正常工作-這是完整的清單:

#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 );

}

輸出為:

getPosition called.
from called.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM