2012-02-09 74 views
0

我有一个类看起来如下喜欢:[连接错误]未定义参考`设置<std::string> ::包含(的std :: string常量&)const的”

template<typename T> 
    class Set{ 
    public: 
    bool contains(const T& e) const; 
    }; 

当我使这个类的一个成员进入另一类是:

class Dfa { 
    private: 
    Set<string> F; 
    public: 
    bool accepts() const 
    { 
    string temp; 
    return F.contains(temp); 
    } 
    }; 

那么,这些r只是实际类的一些函数和函数声明。任何人都可以告诉我,为什么我得到的错误:

[Linker error] undefined reference to `Set<std::string>::contains(std::string const&) const' 

当我编译它,我该如何解决这个错误。谢谢

+0

可能的重复[为什么模板类的实现和声明应该在同一个头文件中?](http://stackoverflow.com/questions/3749099/why-should-the-implementation-and-the -declaration-of-a-template-class-in-the) – 2012-02-09 16:45:21

回答

0

所以,这里是

bool contains(const T& e) const; 

的定义是什么?

看起来像你的定义是在其他文件。 模板函数的定义应该与类一起。 这不像正常的C++类。

+0

即使我将头文件包含在implmentation文件中,那么它也不允许我为它创建另一个实现文件? – Zohaib 2012-02-09 16:43:33

+0

为什么你需要“另一个实现文件”? 如果您试图隐藏模板的实现,那么在C++中是不可能的。你必须公开它。 – PermanentGuest 2012-02-09 17:10:48

2

那么,你应该实现模板类Set的功能。

请记住,模板函数必须内联定义,所以您希望将定义放在同一个头文件中。

+0

我已经在另一个.cc文件中实现了set类,其中包含了它的头文件。 – Zohaib 2012-02-09 16:40:12

+0

这并不准确,关于模板函数必须内联。它们不需要内联,只需要可见即可实例化。但即使它们不可见,它们也可以显式(或隐式)在不同的编译单元中实例化,就像普通函数一样。 – jpalecek 2012-02-09 16:45:25

+0

@Zohaib:把它放在'.h'文件中,这是最直接的方法 – jpalecek 2012-02-09 16:47:14

相关问题