gpt4 book ai didi

c++ - 部分类特化中模板方法的特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:21 24 4
gpt4 key购买 nike

有这段代码:

#include <iostream>
#include <string>
#include <typeinfo>

// template class
template <class U, class X, class T>
class Klasa{
public:
template <class Z>
void Method(){
}
};

// partial class specialization
template <class U>
class Klasa<U, int, U>
{
public:
// template method
template <class Z>
void Method(){
}
};

// error occurs for that!
template <class U>
template <>
void Klasa<U, int, U>::Method<int>(){
}

int main()
{
Klasa<float, int, float> object;
object.Method<float>();
return 0;
}

编译错误:

error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialized
error: template-id ‘Method<int>’ for ‘void Klasa<U, int, U>::Method()’ does not match any template declaration

我尝试对方法进行特化

void Klasa<U, int, U>::Method<int>

,但是编译器不接受它。如何为该方法编写特化?

最佳答案

我明白,对于 Klasa< U, X, T > 的每个部分特化你想“特化”(重载,真的,没有功能(编辑:部分)特化(编辑:你,有效地,试图实现))Method()只需输入一次 X .这是代码 ( ideone link ),看看这是否是您需要的。此外,您可能真的想考虑一些有助于消除重复的特征类(我假设 Method() 对于所有通用 Klasa< U, X, T> 都是相同的,并且您需要为类型 X 的特定特化提供额外的实现)。编辑:也许,我应该提一下,你会在尝试使用 Method< int >() 时遇到编译错误。 .假设该类的用户知道他需要调用 Klasa< U, X, T >::Method()得到X Method< Z >() 的“特化” .

#include <iostream>

template< class U, class X, class T >
class Klasa
{
public:
template< typename Z >
void Method()
{
}
};

template< class U >
class Klasa< U, int, U >
{
public:
template< typename Z >
void Method()
{
typedef typename std::enable_if< !std::is_same< int, Z >::value, Z >::type whatever;

std::cout << "Method< Z >" << std::endl;
}
void Method()
{
std::cout << "Method< int >" << std::endl;
}
};

int main()
{
Klasa< float, int, float > lK;

lK.Method< float >();
lK.Method< double >();
lK.Method();

return( 0 );
}

程序输出:

Method< Z >
Method< Z >
Method< int >

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

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