gpt4 book ai didi

c++ - 部分模板特化 c++ 的不完整类型无效使用

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:01 24 4
gpt4 key购买 nike

我正在尝试专门化一个类方法 foo()。这适用于完整的模板特化。但是,这不适用于部分模板特化。

这里是在 GCC 和 Clang 上编译良好的示例代码:

#include <iostream>
#include <string>

template <typename Key, typename Value>
struct SimpleKey {
Key key;
Value value;
void foo() const {
std::cout << "base" << std::endl;
}
};

/*
// Uncomment this and it won't work !
template<typename Key>
void SimpleKey<Key, std::string>::foo() const {
std::cout << "partial" << std::endl;
}
*/

template<>
void SimpleKey<int, std::string>::foo() const {
std::cout << "full" << std::endl;
}


int main() {
SimpleKey<double, std::string> key1{1.0,"key1"};
key1.foo();
SimpleKey<int, std::string> key2{1,"key2"};
key2.foo();
}

我在取消注释相关代码时得到的关于 Clang 和 GCC 的错误是:

error: invalid use of incomplete type ‘struct SimpleKey >’ void SimpleKey::foo() const {

我应该怎么做才能使部分模板特化以“最小”努力正常工作?

最佳答案

您可以显式特化类模板的特定隐式实例化的成员函数。但这对于部分特化是不允许的。如果你不想写一个完整的偏特化,你可以考虑使用标签分派(dispatch):

private:
void foo(std::true_type /*value_is_string*/) const { /* "partial" */ }
void foo(std::false_type /*value_is_string*/) const { /* "base" */ }

public:
void foo() const { return foo(std::is_same<Value, std::string>()); }

或将 foo() 重构为您部分专门化的基类模板。

关于c++ - 部分模板特化 c++ 的不完整类型无效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30816813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com