2012-02-09 2 views
0

У меня есть класс, который выглядеть Понравилось ниже:[Linker ошибка] неопределенная ссылка на `Set <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); 
    } 
    }; 

Ну, это только некоторые функции и операторы функций фактического класса. Может кто-нибудь пожалуйста, скажите мне, почему я получаю сообщение об ошибке:

[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-be-in-the) –

ответ

0

Итак, где определение

bool contains(const T& e) const; 

?

Похоже, что ваше определение содержится в другом файле. Определение функций шаблона должно быть вместе с классом. Это не похоже на обычные классы C++.

+0

Даже если я включу заголовочный файл в файл имплантации, то он также не позволит мне сделать для него другой файл реализации? – Zohaib

+0

Зачем вам нужен «другой файл реализации»? Если вы пытаетесь скрыть реализацию для шаблона, это невозможно в C++. Вы должны разоблачить его. – PermanentGuest

2

Ну, вы должны реализовать функцию шаблона класса Set.

Помните, что функции шаблона должны быть определены встроенными, поэтому вам захочется поместить определение в тот же заголовочный файл.

+0

Я реализовал заданный класс в другом .cc-файле, где я включил его заголовочный файл. – Zohaib

+0

Это неточно, о том, что функции шаблона должны быть встроенными. Они не должны быть встроенными, они просто должны быть видимыми, чтобы их можно было создать. Но даже если они не видны, они могут быть явно (или неявно) экземплярами в другой единице компиляции, как обычные функции. – jpalecek

+0

@ Zohaib: Поместите его в файл '.h', это самый прямой подход – jpalecek

Смежные вопросы