c++ 两个枚举值相同时的模板类专用化

2exbekwf  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(168)

我有一个Test类,它是在两个相同枚举类型的枚举上模板化的。我正在尝试为这个Test类写一个特殊化,当两个枚举值相同时。

enum class Enum
{
    A,
    B
};

template <Enum ENUM_1, Enum ENUM_2>
class Test {};

template <Enum ENUM>
class Test<ENUM, ENUM> {};

int main()
{
    Test<Enum::A> test;
}

但是,上述操作会导致以下错误:

main.cpp:23:5: error: too few template arguments for class template 'Test'
    Test<Enum::A> test;
    ^
main.cpp:13:7: note: template is declared here
class Test
      ^
1 error generated.

上面的代码有什么问题?

lpwwtiir

lpwwtiir1#

Test正好需要两个模板参数。专用化不会移除ENUM_2。如果要使用单个类型示例化Test,并将其用于ENUM_2,则可以为ENUM_2定义默认值:

template <Enum ENUM_1, Enum ENUM_2 = ENUM_1>
class Test {};
sd2nnvve

sd2nnvve2#

从已接受的回答中列出解决方案,以防其对他人有帮助:

template <Enum ENUM_1, Enum ENUM_2 = ENUM_1>
class Test
{
public:
    Test()
    {
        std::cout << "base\n";
    }
};

template <Enum ENUM>
class Test<ENUM, ENUM>
{
public:
    Test()
    {
        std::cout << "special\n";
    }
};

int main()
{
    Test<Enum::A, Enum::B> test_AB{};
    Test<Enum::A, Enum::A> test_AA{};
    Test<Enum::A> test_A{};
}

打印输出

base
special
special

相关问题