- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个在 CLion 2016.3.4 上开发的 C++14 项目,一段代码给我检查错误。我创建了一个最低限度的代码来重现该问题:
#include <iostream>
#include <type_traits>
#include <system_error>
using error_id_type = int;
template <typename T> using enable_if_condition_enum_t =
typename std::enable_if<std::is_error_condition_enum<T>::value, T>::type;
// Declaration
template <typename T, typename = enable_if_condition_enum_t<T>>
constexpr error_id_type error_enum_to_int(T elem) noexcept;
// Definition
template <typename T, typename = enable_if_condition_enum_t<T>>
constexpr error_id_type error_enum_to_int(T elem) noexcept {
return static_cast<error_id_type>(elem);
};
int main(void) {
error_id_type condition = error_enum_to_int(std::errc::owner_dead); // inspection error here
switch (condition) {
case error_enum_to_int(std::errc::address_in_use): break; // inspection error here
default: break;
}
std::cout << condition << std::endl;
return 0;
}
CLion 给我 Call to "error_enum_to_int" is ambiguous
对于 error_enum_to_int
的每次调用.这种用法真的有问题吗?
一些我尝试过的东西,但恕我直言,这并不能真正解决问题:
T
enable_if_condition_enum_t<T>
的争论(不起作用,给我一整套新的编译和检查错误)。此外,代码在 g++ (GCC) 6.3.1 20170306
上编译和运行得很好,没有任何修复。 .不幸的是,我现在无法访问另一个编译器来测试它,但我猜这是标准的、可移植的 C++11。
当然,始终可以选择 static_cast<some_enum_class>(some_int)
,但我想具体了解这段代码可能有什么问题。
所以,我的问题是:这是我的 IDE 的错误吗,是否真的存在我不知道的语言的一些特殊情况,或者我真的在这里做了一些愚蠢的事情 (:D)?
如有错误请指正
声明本身不是定义,即使它是一个函数模板。函数模板本身在被实例化之前并不是真正的函数。即便如此,编译器应该能够看到同一个函数模板有两次不同的出现,并且不会将一个与另一个混淆,只要两者都存在于同一个编译/翻译单元中。我的看法是 CLion(或者可能是 clang 的静态分析器)以某种方式将声明视为定义并将它们解释为不同的东西。由于两者都是模板,因此对于实例化哪一个变得很困惑。
请注意,声明和定义都出现在同一个编译单元中。另外,constexpr
暗示 inline
,所以单一定义规则仍然适用。此外,我使用 enable_if_condition_enum_t
对于基于 SFINAE 的消除,如果用作参数的枚举未声明为 std::error_condition
枚举。
正在关注 @Angew's answer , 这是 error_enum_to_int
的正确声明和定义.
// Declaration
template <typename T, typename = enable_if_condition_enum_t<T>>
constexpr error_id_type error_enum_to_int(T elem) noexcept;
// Definition
template <typename T, typename>
constexpr error_id_type error_enum_to_int(T elem) noexcept {
return static_cast<error_id_type>(elem);
};
最佳答案
在 C++ 中,您不能为同一参数/模板参数多次提供默认参数或默认模板参数。来自函数所有声明(包括定义)的默认 [template] 参数被组合(级联)。您应该从模板的定义中删除默认模板参数。
关于c++ - SFINAE 消除、Constexpr 和函数模板 : Can I keep declaration and definition separate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891055/
我是 CAN 协议(protocol)的新手,正在阅读 Robert Bosch 的 CAN 规范 ver2.0 B 部分。我无法理解第 63 页上的以下几行 ”注意:启动/唤醒:如果在启动期间只有一
我用 C 写了一些代码来读取 CAN 总线数据。当我读取 11 位 CAN ID 时一切正常。一旦我尝试读取 29 位 ID,它就会错误地显示 ID。 示例: 接收29位ID的消息: 0x01F0A0
如果这看起来与另一个问题相似或者看起来已经得到回答,我提前道歉。我觉得它非常详细,足以证明自己的问题。 我正在尝试寻找一个虚拟的 CAN 总线模拟器(或一些可以轻松制作模拟器的方法),它只会生成 CA
我的问题涉及 GNU 的品牌。 如果您有一系列命令可用作多个目标的配方,则 canned recipe派上用场了。我可能看起来像这样: define run-foo # Here comes a #
您好,我是一名学习canopen的学生。Canopen中的COB-ID和CAN标识符有什么关系?我在CIA主页上看到COB-ID不是CAN ID,但我不明白。 例如,如果 PDO 通过 CAN 总线传
我知道一个显性确认位是由另一个节点传输的消息的接收器发送的。 我无法理解的是,接收方是在接收到整个消息后发送单个显性位,还是接收者发送相同的消息,其中 ACK 位字段为显性? 或者是接收器在发送器传输
我是 CAN 协议(protocol)的新手,我正在尝试通过 Linux 的 SocketCAN 使用它。然而,我对可用的 2 种不同的 CAN 套接字(RAW 和广播管理器 (BCM))感到困惑。
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试制作一个在 Windows 下运行并与 ELM327 设备通信的软件。我创建了第一个版本,然后我进入了我的 SMART ForTwo (SMART 451) 车辆,我设法连接了仪表盘(发送
我知道在 CAN Controller 中,如果错误计数达到某个阈值(比如 255),就会发生总线关闭,这意味着特定的 CAN 节点将从 CAN 网络中关闭。所以根本不会有任何交流。但是,如果上述情况
我正在使用 ELM327,我希望能够设置要发送的 CAN 消息的 header 和数据部分。我看到有一个代码用于设置消息的标题 SH xxyyzz 但是我很难找出如何设置数据部分并控制何时发送消息。
我想做的是: 将数据插入具有两列的表中,并在同一 PHP 页面中显示更新的值。我能够获取数据并显示它,但无法插入任何数据。请指导我。 文件名为 mypage.php 到目前为止我的代码:
(这个问题是关于 Android 11 的) 我想将崩溃日志打印到其他应用程序可以读取的文件中(具体来说,我希望能够导航到该文件并使用"file"应用程序查看数据)。 我看过很多关于这个问题的答案,但
这会产生“ fatal error :无法解开Optional.None”,我似乎不明白为什么 var motionManager = CMMotionManager() motionManager.
在 Java 中,我经常遇到带有后缀 -able 的接口(interface),例如可序列化、可迭代等。这表明实现这些接口(interface)的对象具有可以对其执行某些操作的特性,例如该对象可以被序
我正在阅读 CanJS API 文档并遇到 can.Construct.extend http://canjs.com/docs/can.Construct.extend.html .我知道 can.
我正在使用 C 语言在 STM32F1xx 上进行开发,直到现在我都在尝试使用“CANopenNode-master”实现 CANopen 堆栈,并且我正在使用 2 个中断。 第一个是用于处理 SYN
我一直在使用 SocketCAN,尤其是 Virtual CAN vcan。但是,到目前为止,我从未使用过 CAN FD(灵活数据速率)。 好吧,我今天早上用 can-utils 试了一下: cans
我正在运行一个带有两个 CAN channel 的程序(使用 TowerTech CAN Cape TT3201)。 两个 channel 是 can0 (500k) 和 can1 (125k)。 c
存储由序列字符组成的字符串的 %s 格式说明符可以存储整数序列吗?如果是的话..你能解释一下吗? 最佳答案 无论如何,数字都是用字符表示的,所以是的,您可以使用 "%s" 说明符读取数字并将其存储在
我是一名优秀的程序员,十分优秀!