【发布时间】:2009-12-14 19:49:47
【问题描述】:
如何从虚拟模板类继承,在此代码中:
// 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 或 DInt 时,链接器抱怨存在未解析的外部,即 Derived<std::string>::Foo() 和 Derived<std::string>::Bar(),Derived<int> 也是如此。
我是否遗漏了代码中的某些内容?
编辑: 谢谢大家。现在很清楚了。
【问题讨论】:
-
一个好的做法是将模板的实现放在同一个标题中。 AFAIK :)
-
在许多编译器中,这不仅是一种好的做法,而且是必需的。
标签: c++ inheritance templates