2015-10-17 40 views
0

我有一個模板化的接口和模板實現。我也有一個方法將接口的專門化作爲參數。我收到一個鏈接器錯誤:C++鏈接器錯誤與模板虛擬方法

"symbol(s) not found for architecture...

這是爲什麼?實現這個目標的正確方法是什麼:一個可以與各種類型一起工作的接口,一個可以與各種類型一起工作的實現,以及一個接受專用於給定類型的接口的方法?

下面的例子只是一個簡單的例子,我的實際類有不同的功能。

感謝

#include <iostream> 

template<class T> 
class IStore{ 
public: 
    virtual T get() = 0; 
    virtual void set(T t) = 0; 
}; 

template<class T> 
class SimpleStore : public IStore<T>{ 
public: 
    T get() override{ return value; } 
    void set(T t) override{ value = t; } 
private: 
    T value; 
}; 

void Print(IStore<double> mydouble){ std::cout<<mydouble.get(); } 

int main(int argc, const char * argv[]) { 
    SimpleStore<double> one; 
    one.set(1.0); 
    Print(one); 
    return 0; 
} 

回答

1

我看到你的代碼的一個主要問題:你把一個抽象類作爲值參數。這會造成各種不好的事情。這實際上可能是你所問的問題的根源,但我不確定。

+0

你說得對,用'打印(IStore &mydouble)'來代替'Print(IStore mydouble)'作品。我仍然不明白爲什麼。 – user1188374

+1

您正在迫使編譯器嘗試鏈接純虛函數,以便爲永遠不可實例化的類創建虛擬表。它應該導致更好的錯誤,但無論如何。 –

+0

我不得不閱讀你的評論5次瞭解,但我想我明白了。謝謝! – user1188374