gpt4 book ai didi

c++ - 专门化内部类的实现

转载 作者:行者123 更新时间:2023-11-30 04:21:15 25 4
gpt4 key购买 nike

我正在尝试专攻 Outer<P>::Inner在类型上 P如下所示,它似乎可以工作(在 gcc 4.5.3 和 Visual Studio 2008 上),直到成员变量 Inner iOuter<P> 中声明.有没有办法申报Inner i没有专业Outer<P>

#include <cstdlib>
#include <iostream>

template<typename T>
struct Outer
{
Outer()
{
Inner();
}

struct Inner;
//Inner i; // compilation error
};

template<>
struct Outer<bool>::Inner
{
Inner()
{
std::cout << "Specialization ..." << std::endl;
}
};

template<typename T>
struct Outer<T>::Inner
{
Inner()
{
std::cout << "Generic version ..." << std::endl;
}
};

int main()
{
Outer<char> o2;
Outer<bool> o1;
return EXIT_SUCCESS;
}

最佳答案

特化必须在 namespace 级别完成。因此,最简单的方法是在命名空间级别声明 Inner:

template <typename T>
struct Outer_Inner
{
Outer_Inner()
{
std::cout << "Generic version ..." << std::endl;
}
};

template <>
struct Outer_Inner<bool>
{
Outer_Inner()
{
std::cout << "Specialization ..." << std::endl;
}
};


template<typename T>
struct Outer
{
Outer() : i()
{
}

Outer_Inner<T> i; // no error anymore
};

在 C++11 中,有一种变通方法可以在类中定义所有内容,但我不推荐这样做。

template<typename T>
struct Outer
{
Outer() : i()
{
}

struct generic_inner
{
generic_inner()
{
std::cout << "Generic version ..." << std::endl;
}
};

struct special_inner
{
special_inner()
{
std::cout << "Specialization ..." << std::endl;
}
};

typename std::conditional<std::is_same<T, bool>::value,
special_inner, generic_inner>::type i;
};

关于c++ - 专门化内部类的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631586/

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