问题标签 [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.
c++ - 有没有办法仅在实例化特定类模板(专业化)时调用初始化函数?
我正在为各种计算功能设计一个包装器。一些底层后端需要在调用任何其他 API 之前调用一些 init 函数。我可以使用一些在 main 之前初始化的静态变量,并将其包装在一些函数中,如此处所述,以便我可以捕获初始化期间产生的任何错误。
我想知道是否有更好的方法来处理这个问题。请注意,永远不会有类模板的实例,因为一切都是 typedef 或静态成员。
c++ - 如何区分模板类和类定义中的隐式模板参数?
C++ 允许引用模板类的模板参数,而不是它的实例。例如fun
下面的函数。
同时有一个特性可以在类定义中省略模板参数。例如在 的定义中template<class T> class A
,我们可以说A
to 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。如果我没有使用正确的命名约定,请更正或告诉我。)
c++ - 构造函数中的c ++参数包规范而不是模板
与带有参数包的函数声明不同,我发现类需要尖括号中每个参数的类型......
...这似乎是多余的。这是我的定义Component
:
- 有没有办法
int, int
从上述声明中删除? - 如果是这样,是否可以删除它?
- 另外,我的实例化方式
m_data
安全吗?使用std::forward<T_Args>(args)...
编译器时告诉我,我没有可以转换所有参数类型的构造函数。
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
任何有关如何修复这些错误的帮助将不胜感激!
c++ - 为什么不能部分专门化一个类成员函数?
模板类的成员函数可以完全专门化,例如
可以毫无问题地编译。请注意,这foo()
不是模板函数,因此这与模板函数专业化无关(我可以理解部分专业化是不允许的,因为它与重载结合起来会变得非常混乱)。在我看来,上面的代码只是以下模板类专业化的简写:
这个对吗?
在这种情况下,我想知道为什么不允许使用类似速记的部分专业化,即为什么我不能写
作为简写
由于第二个片段是合法的,而第一个片段将完全等同于它(但我不必显式复制所有其他数据成员并永远并行维护它们),我不明白为什么不允许第一个片段。
我知道这个问题已经在这里和这里被问过,但我不是在寻找“确实不允许”类型的答案。或“这是不允许的,因为标准说不允许。”,也没有解决这个问题的方法。我想知道为什么标准不允许这样做,即这是有根本原因还是将来会被允许?到目前为止,我在任何明显的重复问题中都没有发现这一点。
c++ - 下面的程序应该按照标准编译吗?
在我发现 MSVC 和 GCC 之间在编译和链接相同代码时不一致(可能也是 clang)之后,我很好奇这个程序是否真的编译和链接,因此它是 MSVC 中的错误(报告链接器错误)或应该我写的不一样。该程序由3个文件组成:
通道
A.cpp:
B.cpp:
MSVC 产生的链接器错误是:
A.obj:错误 LNK2019:未解析的外部符号“public:void __thiscall A::func(void)”
所以基本上它决定不创建符号超出定义放置在B.cpp
. 让我强烈怀疑它是一个错误的事情是,将非专业定义func
移出结构定义,甚至将其置于专业化声明之上,使程序链接成功,但我想确定。
所以我的问题是 - 这个程序是否应该由符合标准的编译器/链接器编译和链接而没有错误?
c++ - 为什么 SFINAE 需要“启用”类模板参数?
(本题与C++11/C++14无关:示例使用C++03编译)
enable_bool<T>
::type
只有当T
是时才有成员bool
在下一个片段中,部分特化是正确的(参见gcc.godbolt.org)
由于enable_bool<T>::type
已经对应于T
(when T
is bool
)
,我们很想分解参数T
和Enable
。
但编译器抱怨(见gcc.godbolt.org)
为什么编译器不能T
在上述部分特化中推导出模板参数?
c++ - 为什么这个对 swap() 的调用模棱两可?
以下程序
导致g++
并clang
在我的系统上发出以下编译器错误:
我不明白为什么std::swap
被认为是候选重载,但这与foo
. 的使用有关std::allocator<T>
。
消除foo
的第二个模板参数允许程序无错误地编译。
c++ - 从 C++ 中的类模板中的函数调用另一个成员函数
假设我有一个myTemplate
以一些成员变量和两个成员函数funcTempA
. 和. 命名的类模板funcTempB
。
funcTempB
调用funcTempA
它的实现。我只想知道调用它的正确语法是什么。