gpt4 book ai didi

c++ - 模板类中的类模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:48 25 4
gpt4 key购买 nike

重构遗留代码我想合并彼此相关的单独模板类/结构(以避免命名空间污染)。

Nested(下)是 MyStruct 的辅助类,我想将其移入 MyStruct

但我无法完成这项工作:

#include <type_traits>
#include <iostream>

struct YES {} ;
struct NO {};

template <typename TYPE>
struct MyStruct
{

template <typename TYPE_AGAIN = TYPE, typename SELECTOR = NO>
struct Nested
{
static void Print(void)
{
std::cout << "MyStruct::Nested<bool = false>::Print()" << std::endl;
}
};


template <>
struct Nested<TYPE, typename std::enable_if<std::is_integral<TYPE>::value, YES>::type>
{
static void Print(void)
{
std::cout << "MyStruct::Nested<bool = true>::Print()" << std::endl;
}
};

};

编译器提示:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
In file included from ../main.cpp:8:0:
../MyStruct.h:31:12: error: explicit specialization in non-namespace scope ‘struct MyStruct<TYPE>’
template <>
^
make: *** [main.o] Error 1

其实我也很烦恼必须包括

<typename TYPE_AGAIN = TYPE>

但没有,提示就更多了:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
In file included from ../main.cpp:8:0:
../MyStruct.h:31:12: error: explicit specialization in non-namespace scope ‘struct MyStruct<TYPE>’
template <>
^
../MyStruct.h:32:9: error: template parameters not used in partial specialization:
struct Nested<typename std::enable_if<std::is_integral<TYPE>::value, YES>::type>
^
../MyStruct.h:32:9: error: ‘TYPE’
make: *** [main.o] Error 1

最佳答案

您不能在非命名空间范围内专门化模板,例如您的情况下的 struct

您必须将特化放在结构定义之外:

template<typename TYPE> template<>
struct MyStruct<TYPE>::Nested<...> {};

但现在你有另一个问题,如果你想特化模板类中的模板,你必须为每个模板类特化它。您不能只特化一个成员函数,您必须特化整个类。

所以,你需要这样做:

template<> template<>
struct MyStruct<int>::Nested<...> {};

另外,你真的不需要 SFINAE 来做这个:

template<typename SELECTOR>
struct Nested; // Default invalid SELECTOR

template<>
struct Nested<YES> { /*...*/ };

template<>
struct Nested<NO> { /*...*/ };

关于c++ - 模板类中的类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40068099/

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