作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下内容:
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<>
生成的通用版本中,进行特化的各种方法,都没有用(根据我的尝试,我有几个不同的错误消息,所以在这里发布它们可能不是很有帮助)。那么,如何部分特化静态成员函数,使特化函数覆盖泛型类中的函数?
最佳答案
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"; }
};
关于c++ - 偏特化和静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47080216/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!