我有以下内容:
template<typename T, bool is_derived = false>
struct A
{
T v_;
static const char* getMehStatic();
virtual const char* getMeh() const { return getMehStatic(); }
};
template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, true>
{
static const char* getMehStatic();
};
template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }
int main()
{
A<std::vector<int>> a;
std::cout << a.getMeh();
}
当我编译它时,链接器抱怨它找不到getMehStatic();
这是因为它寻找泛型类型。换句话说,它似乎跳过了我尝试提供部分专业化A<std::vector<T>>
的实现。
我从泛型版本派生我的专业类,使用默认参数选择正确的类,否则专门的类将从自身派生。
我尝试了各种各样的事情 - 阻止使用getMehStatic()
生成通用版本中的enable_if<>
,各种方式进行专业化,没有工作(我有几个不同的错误)消息取决于我尝试的内容,所以在这里发布它们可能不是很有帮助)。那么,我如何部分地专门化静态成员函数,使专用函数覆盖泛型类中的函数?
答案 0 :(得分:2)
缺少A<std::vector<T>, true>::getMehStatic()
的定义。
不幸的是,你不能局部专门化它。您可以提供通用定义:
template<typename T, bool is_derived>
const char* A<T, is_derived>::getMehStatic() { return "generic"; }
但由于A<std::vector<T>>
未覆盖getMeh()
,因此它是调用的通用方法。
CRTP确实可以解决这个问题:
template<typename T, typename Derived>
struct A
{
T v_;
const char* getMeh() const { return Derived::getMehStatic(); }
};
struct B : A<std::vector<int>, B>
{
static const char* getMehStatic() { return "vector"; }
};
答案 1 :(得分:1)
那么,我如何部分地专门化静态成员函数,使专用函数覆盖泛型类中的函数?
通过CRTP,类似
template<typename T, typename Derived = void>
struct A
{
T v_;
static const char* getMehStatic();
virtual const char* getMeh() const {
if constexpr( std::is_same_v<Derived,void> )
return getMehStatic();
else
return Derived::getMehStatic();
}
};
template<typename T>
struct A<std::vector<T>> : public A<std::vector<T>, A<std::vector<T>> >
{
static const char* getMehStatic();
};
template<typename T, typename Derived>
const char* A<T,Derived>::getMehStatic() { return "generic"; }
template<typename T>
const char* A<std::vector<T>>::getMehStatic() { return "vector"; }