如何從虛擬模板類繼承,在此代碼繼承:從在C虛擬模板類++
// test.h
class Base {
public:
virtual std::string Foo() = 0;
virtual std::string Bar() = 0;
};
template <typename T>
class Derived : public Base {
public:
Derived(const T& data) : data_(data) { }
virtual std::string Foo();
virtual std::string Bar();
T data() {
return data_;
}
private:
T data_;
};
typedef Derived<std::string> DStr;
typedef Derived<int> DInt;
// test.cpp
template<typename T>
std::string Derived<T>::Foo() { ... }
template<typename T>
std::string Derived<T>::Bar() { ... }
當我嘗試使用DSTR或力,鏈接器抱怨說,有無法解析的外部,它們分別是Derived<std::string>::Foo()
和Derived<std::string>::Bar()
,以及Derived<int>
。
我在代碼中錯過了什麼嗎?編輯: 謝謝大家。現在很清楚。
一個好的做法是將模板的實現放在同一個頭文件中。 AFAIK :) – AraK 2009-12-14 19:53:39
在許多編譯器中,這不僅僅是良好的做法,而且是必需的。 – Joe 2009-12-14 20:16:18