2013-11-13 6 views
2

Неохотно я не мог найти сообщение о моей следующей проблеме. Я хочу написать класс litte, который перегружает < < -Operator, чтобы получить переменные типы данных с использованием шаблонов. .h-файл моего класса выглядит следующим образом:C++: Overload << Оператор с шаблонами

class MyClass { 

    private: 
     ... 

    public: 
     template <typename> void operator<<(T data); 
}; 

CPP-файл:

template <typename T> void MyClass::operator<<(T data) { 
    ... 
    return; 
} 

Теперь я хочу использовать свой класс:

MyClass mc; 
mc << "Test"; 
mc << 123; 

Но мой компилятор GCC не будет скомпилировать его, что даст мне следующее сообщение об ошибке:

undefined reference to `void MyClass::operator<< <char const*>(char const*)' 

или, если я использую int, например:

undefined reference to `void MyClass::operator<< <int>(int)' 

Что я делаю неправильно ??? Кто-нибудь может мне помочь?

+0

http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html – yuyoyuppe

+0

Где вы задаете T в вашем коде? – Jepessen

+0

Закрытие вопроса как дубликата, а затем не предоставление ссылки на дубликат, не полезно. – JBentley

ответ

1

Вы должны перенести реализацию из .cpp в файл .h. Вы можете определить его на месте непосредственно:

class MyClass { 

    private: 
     ... 

    public: 
     template <class T> 
     void operator << (const T& data) 
     { 
      //do stuff based on T 

      cout << data << " with size:" << sizeof(T); 
     } 
}; 
+1

Не совсем точно. У вас нет ** **, чтобы переместить его из файла .cpp, вам просто нужно убедиться, что компилятор может создавать типы, которые вы хотите использовать. Если вы заранее знаете, какие типы вы будете использовать, то другой способ сделать это [явное создание экземпляра] (http://stackoverflow.com/a/2351622/1227469). Кроме того, распространенная практика заключается в том, чтобы поместить определения в отдельный заголовок реализации и включить этот файл в конец файла '.h'. – JBentley

+0

@JBentley Вы правы, но я хотел сохранить информацию, чтобы предотвратить недоразумение на примере, предоставленном вопросом. – Raxvan

+0

Спасибо всем за ваши ответы! Я переместил реализацию функции в файл заголовка, и он сработал! –

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