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

标签 c++ templates template-specialization

我正在尝试专门化一个类方法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 {

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

最佳答案

您可以显式地专门化类模板的特定隐式实例化的成员函数。但这对于部分特化是不允许的。如果你不想编写完整的部分特化,可以考虑使用标签调度:

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/

相关文章:

c++ - 在 SWIG 中处理来自 self 的特殊实例的类继承

c++ - "Destructor already defined"带有专门的析构函数

c++ - 可变大小的对象可能未被初始化

c++ - 类实例成员初始化

c++ - 在这种情况下,如何管理继承?

c++ - 作为容器的初始化程序列表不起作用

c++ - 如何让对象相互通信?

android - 这似乎不是 “Debug” 版本

c++ - 简单类迭代器的开始、结束规范

C++ 专门化派生类中的继承模板