模板专用化与静态函数模板
Template Specialization with Template for Static Function
我有一个从另一个模板继承的模板,其自身作为第二个模板的模板参数。 继承的模板定义了一个静态函数:
template<class T> class A
{
public:
static void foo();
};
template<class T> class B : public A<B>
{
};
现在我想为专门用于 B 的类 A 实现静态函数,但 B 不专用。 但是我不知道如何声明模板。 我什至不确定这是否可能。 我的第一次尝试是:
template<class T> void A<B<T>>::foo()
{
}
但这给出了错误:
"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization"
我尝试了不同的事情,例如在前面添加"模板<>",但没有一个奏效。 我能够编译这个:
template<> void A<B<int>>::foo()
{
}
以及这个:
template<class T> void A<T>::foo()
{
}
这是部分专业化的尝试吗? 我的第一印象是否定的(没有具有多个参数的模板,我想专门化其中一个(。 相反,我想用另一个不专门的模板专门化一个模板。 这是否可能,如果是,正确的语法是什么?
这确实是部分专业化。你不能部分专化一个方法,你必须部分专化整个类。看到这个答案。您可以尝试在单独的帮助程序结构中实现 foo,并改为部分专用于该结构。
下面是使用帮助程序结构的示例。
#include <iostream>
template<class T> struct t_helper
{
static void foo()
{
std::cout << "Not B<T>n";
}
};
template<class T> class A
{
public:
static void foo() {
t_helper<T>::foo();
}
};
template<class T> class B {};
// Specialize the behavior of A<T>::foo() for all B types
template<class T>
struct t_helper<B<T>>
{
static void foo()
{
std::cout << "Is B<T>n";
}
};
int main()
{
A<int>::foo(); // Prints "Not B<T>n"
A<B<int>>::foo(); // Prints "Is B<T>n"
return 0;
}
相关文章:
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 指向模板上下文中的成员函数或静态函数的指针
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- 生成模板实例列表并对其调用静态函数
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 在执行 SFINAE 时访问模板派生类 (CRTP) 的静态函数时类型不完整
- 模板专用化与静态函数模板
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- 静态函数作为类模板参数-导致可维护性问题
- C++ - 模板类 -> 静态函数 -> 静态函数指针的链接错误
- 使用g++编译时静态函数的模板专用化
- 使用类的静态函数模板成员的链接器错误
- 为什么要使用静态函数模板
- 模板类中静态函数或指针的作用域解析
- 在cuda中使用静态成员函数模板结构的另一种方法
- 成员模板静态函数的类型特征
- C++模板,静态函数专用化
- 为什么其中一个模板静态函数有效,而另一个不起作用
- 在依赖范围内调用静态函数模板
- 静态函数模板和MISRA C++