具有默认模板参数的模板结构未实例化

2024-03-14

假设我有这个代码

template<typename T2, typename T = int>
struct X
{
    static double f;
};

template<typename T>
double X<T>::f = 14.0;

如果我尝试编译 clang 会出现以下错误

声明的嵌套名称说明符“X::”不引用 类、类模板或类模板部分特化

对于海湾合作委员会:

错误:非模板“double X::f”的模板定义

问题是 :

为什么编译器希望我们像这样专门化 struct X :

template<typename T2>
struct X<T2,int>
{
    static double f;
};

第一个声明有int作为默认参数,为什么编译器不选择这个声明?

我在standard http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf锚[temp.spec] 但没有帮助。

我回答这个问题后问这个问题one https://stackoverflow.com/q/31623570/5076707 on SO.

感谢您的帮助 !


“为什么编译器希望我们像这样专门化结构 X”——这不是错误消息所说的内容。你不need这样做,你真的不应该这样做,除非你想要的是部分专业化和仅为该部分专业化定义的静态成员。

问题是template<typename T2, typename T = int> struct X是一个类模板,具有two模板参数。第二个具有默认模板参数的事实并没有改变仍然有两个参数的事实。

因此,您需要将类模板成员定义为属于具有两个参数的类模板,如下所示:

template<typename T2, typename T>
double X<T2, T>::f = 14.0;

标准中的相关段落(N4527,当前草案):

[14.5.1p3]

当成员函数、成员类、成员枚举、静态 定义了数据成员或类模板的成员模板 在类模板定义之外,成员定义是 定义为模板定义,其中模板参数是 那些类模板。使用的模板参数的名称 成员的定义可能与模板不同 类模板定义中使用的参数名称。模板 成员中类模板名称后面的参数列表 定义应按照与使用的顺序相同的顺序命名参数 在成员的模板参数列表中。每个模板参数 pack 应在模板参数列表中用省略号扩展。

[14.1p9]

[...]默认模板参数不得在模板参数列表类成员的定义 出现在成员班级之外的模板。 [...]


正如上面引用中所指定的,模板参数的实际名称(T2 and T)没关系,它们可以与类模板定义中的不同,但它们需要在成员的定义中保持一致。也就是说,你可以这样做

template<typename T, typename U>
double X<T, U>::f = 14.0;

它仍然会定义正确的成员X类模板。但是,使用相同的名称可以使阅读代码时更容易理解。


通过在定义之前定义部分特化f在你原来的例子中,template<typename T> double X<T>::f = 14.0;成为成员的有效定义f部分专业化template<typename T2> struct X<T2,int>,并且仅属于该模板(部分专业化是模板本身)。会员f主模板的template<typename, typename> struct X仍然未定义。

相关措辞在[14.5.5.3p1]中:

类模板partial成员的模板参数列表 专业化应与类的模板参数列表相匹配 模板部分专业化。 a 的模板参数列表 类模板部分特化的成员应匹配 类模板部分特化的模板参数列表。 A 类模板特化是一个独特的模板。成员为 类模板部分特化与成员无关 主模板的。 [...]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有默认模板参数的模板结构未实例化 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 选择initializer_list迭代器定义

    Why std initializer list
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 检查两个函数或成员函数指针的签名是否相等

    我编写了一些代码来检查自由函数的签名是否等于成员函数的签名等 它比较提取的返回类型和函数参数 include
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐