问题标签 [class-template]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
114 浏览

c++ - 有没有办法仅在实例化特定类模板(专业化)时调用初始化函数?

我正在为各种计算功能设计一个包装器。一些底层后端需要在调用任何其他 API 之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在一些函数中,如此处所述以便我可以捕获初始化期间产生的任何错误。

我想知道是否有更好的方法来处理这个问题。请注意,永远不会有类模板的实例,因为一切都是 typedef 或静态成员。

0 投票
0 回答
50 浏览

c++ - 如何区分模板类和类定义中的隐式模板参数?

C++ 允许引用模板类的模板参数,而不是它的实例。例如fun下面的函数。

同时有一个特性可以在类定义中省略模板参数。例如在 的定义中template<class T> class A,我们可以说Ato imply A<T>

我发现两个规则都可能产生歧义的情况。此外,我无法解决歧义。这里是一个 MWE,在我的定义中template<class T> class B我需要将其B称为模板类而不是B<T>.

(我需要这样做,因为该函数g是我想在类中定义的友元函数。)

Clang 3.5 给出了上述错误,GCC 4.9.2 可以接受。最糟糕的是,我无法制定额外的规范并解决歧义。

例如我试过:

但仍然得到同样的错误。

有没有办法告诉clang(或有问题的编译器)B不是B<T>模板类B

(我使用了一些 C++11 语法来简化示例,但问题也适用于 C++98。如果我没有使用正确的命名约定,请更正或告诉我。)

0 投票
2 回答
406 浏览

c++ - 构造函数中的c ++参数包规范而不是模板

与带有参数包的函数声明不同,我发现类需要尖括号中每个参数的类型......

...这似乎是多余的。这是我的定义Component

  1. 有没有办法int, int从上述声明中删除?
  2. 如果是这样,是否可以删除它?
  3. 另外,我的实例化方式m_data安全吗?使用 std::forward<T_Args>(args)...编译器时告诉我,我没有可以转换所有参数类型的构造函数。
0 投票
1 回答
196 浏览

c++ - 链表函数实现帮助:insertEnd C++

所以我实现了一个函数 insertEnd 的定义,它在链表的末尾插入一个链表节点。在大多数情况下,它似乎可以独立工作,但是在其他功能(例如连接两个链表)中使用它时我似乎遇到了问题,并且在调用它时控制台上什么也没有显示,所以我什至不能使用断点调试

编辑:这就是我尝试使用 insertEnd 的内容(一个连接的函数)在此处输入图像描述

我最初所做的是使用在链表开头插入的不同插入,它有效,但这不是这个新的重载函数应该做的(假设将一个列表附加到另一个列表的后面),所以我创建了 insertEnd 来尝试使用它。

0 投票
1 回答
2782 浏览

c++ - 对模板 INL 文件非常困惑

好的,我以为我已经找到了模板类的实现文件,但显然没有......我在 VS 2013 C++ 解决方案中有以下文件:

主文件

状态管理器.h

状态管理器.inl

状态.h

状态.inl

构建此项目会产生以下错误:

错误 10 错误 C1903:无法从先前的错误中恢复;停止编译 state.inl 9 1

错误 9 错误 C2065:“上下文”:未声明的标识符 state.inl 8 1

错误 7 错误 C2065:“经理”:未声明的标识符 state.inl 7 1

错误 8 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int state.inl 7 1

错误 6 error C2039: 'State' : is not a member of '`global namespace'' state.inl 6 1

错误 1 ​​错误 C2143:语法错误:缺少 ';' 在'<'之前 state.inl 2 1

错误 2 错误 C2988:无法识别的模板声明/定义 state.inl 2 1

错误 3 错误 C2059:语法错误:'<' state.inl 2 1

错误 4 错误 C3083: 'Context': '::' 左侧的符号必须是 state.inl 2 1 类型

错误 5 error C2039: 'Context' : is not a member of '`global namespace'' state.inl 2 1

任何有关如何修复这些错误的帮助将不胜感激!

0 投票
1 回答
841 浏览

c++ - 为什么不能部分专门化一个类成员函数?

模板类的成员函数可以完全专门化,例如

可以毫无问题地编译。请注意,这foo()不是模板函数,因此这与模板函数专业化无关(我可以理解部分专业化是不允许的,因为它与重载结合起来会变得非常混乱)。在我看来,上面的代码只是以下模板专业化的简写:

这个对吗?

在这种情况下,我想知道为什么不允许使用类似速记的部分专业化,即为什么我不能写

作为简写

由于第二个片段是合法的,而第一个片段将完全等同于它(但我不必显式复制所有其他数据成员并永远并行维护它们),我不明白为什么不允许第一个片段。

我知道这个问题已经在这里这里被问过,但我不是在寻找“确实不允许”类型的答案。或“这是不允许的,因为标准说不允许。”,也没有解决这个问题的方法。我想知道为什么标准不允许这样做,即这是有根本原因还是将来会被允许?到目前为止,我在任何明显的重复问题中都没有发现这一点。

0 投票
2 回答
198 浏览

c++ - 下面的程序应该按照标准编译吗?

在我发现 MSVC 和 GCC 之间在编译和链接相同代码时不一致(可能也是 clang)之后,我很好奇这个程序是否真的编译和链接,因此它是 MSVC 中的错误(报告链接器错误)或应该我写的不一样。该程序由3个文件组成:

通道

A.cpp:

B.cpp:

MSVC 产生的链接器错误是:

A.obj:错误 LNK2019:未解析的外部符号“public:void __thiscall A::func(void)”

所以基本上它决定不创建符号超出定义放置在B.cpp. 让我强烈怀疑它是一个错误的事情是,将非专业定义func移出结构定义,甚至将其置于专业化声明之上,使程序链接成功,但我想确定。

所以我的问题是 - 这个程序是否应该由符合标准的编译器/链接器编译和链接而没有错误?

0 投票
1 回答
183 浏览

c++ - 为什么 SFINAE 需要“启用”类模板参数?

(本题与C++11/C++14无关:示例使用C++03编译)

enable_bool<T>::type只有当T是时才有成员bool

在下一个片段中,部分特化是正确的(参见gcc.godbolt.org

由于enable_bool<T>::type已经对应于T(when Tis bool)
,我们很想分解参数TEnable
但编译器抱怨(见gcc.godbolt.org

为什么编译器不能T在上述部分特化中推导出模板参数?

0 投票
2 回答
2807 浏览

c++ - 为什么这个对 swap() 的调用模棱两可?

以下程序

导致g++clang在我的系统上发出以下编译器错误:

我不明白为什么std::swap被认为是候选重载,但这与foo. 的使用有关std::allocator<T>

消除foo的第二个模板参数允许程序无错误地编译。

0 投票
2 回答
1405 浏览

c++ - 从 C++ 中的类模板中的函数调用另一个成员函数

假设我有一个myTemplate以一些成员变量和两个成员函数funcTempA. 和. 命名的类模板funcTempB

funcTempB调用funcTempA它的实现。我只想知道调用它的正确语法是什么。