2015-10-17 41 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