模板部分专用化不起作用
Template partial specialization won't work
我不明白为什么以下失败:
#include <cassert>
#include <memory>
#include <utility>
using namespace std;
template<typename... T> struct name{ static const char* value; };
template<typename... T> const char* name<T...>::value = "unknown";
template <> const char* name<int>::value = "int";
template <> const char* name<float>::value = "float";
template <> const char* name<template<typename,typename> class T>::value = "pair";
int main()
{
assert(name<int>::value == "int");
assert(name<float>::value == "float");
assert(name<double>::value == "unknown");
assert((name<pair<int, char> >::value) == "pair");
}
问题出在线路上
template <> const char* name<template<typename,typename> class T>::value = "pair";
[temp.class.spec.mfunc]应该定义这种行为,但在阅读了标准之后,我仍然不理解它。有人能(以最清晰、最简洁的方式)解释一下为什么这些都不起作用吗?
template <> const char* name<template<typename,typename> class T>::value = "pair";
template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair";
您可以部分专门化类模板,但不能部分专门化一个类模板的成员。这正是你试图用pair
做的事情。
为什么常规尝试不起作用:
template <> const char* name<template<typename,typename> class T>::value = "pair";
明确的专业化(也就是说,不是部分专业化)不是模板。它以template <>
为前缀,并且完全专用的模板名称必须为所有模板参数指定参数。所以你可以这样做:
template <> const char* name<std::pair<int, double>>::value = "pair";
但是,您的原始代码在语法上毫无意义——如果有什么不同的话,它看起来就像是试图在模板参数列表中声明一个双参数类模板T
。
关于第二行:
template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair";
这是部分专业化的正确语法。不幸的是,正如我上面所说,你不能部分专门化类模板成员,只能专门化整个类模板。所以你必须这样做:
template <typename T1, typename T2> struct name<std::pair<T1,T2>>
{
static const char* value;
};
template <typename T1, typename T2> const char* name<std::pair<T1,T2>>::value = "pair";
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 函数模板中的显式模板专用化不起作用
- 完整的模板专用化不起作用:没有与指定类型匹配的函数模板"mysort2"实例 STLests
- 函数专用化不起作用
- 方法的简单专用化不起作用(C++)
- 模板部分专用化不起作用
- 当我尝试部分专用化函数模板时,为什么我的程序不起作用?