Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFINAE消除、Constexpr和函数模板:我可以将声明和定义分开吗?_C++_C++11_Constexpr_Clion_Function Templates - Fatal编程技术网

C++ SFINAE消除、Constexpr和函数模板:我可以将声明和定义分开吗?

C++ SFINAE消除、Constexpr和函数模板:我可以将声明和定义分开吗?,c++,c++11,constexpr,clion,function-templates,C++,C++11,Constexpr,Clion,Function Templates,我有一个C++14项目,我正在CLion 2016.3.4上开发,其中一段代码给了我检查错误。我创建了一个简单的最小代码来重现问题: #include <iostream> #include <type_traits> #include <system_error> using error_id_type = int; template <typename T> using enable_if_condition_enum_t = ty

我有一个C++14项目,我正在CLion 2016.3.4上开发,其中一段代码给了我检查错误。我创建了一个简单的最小代码来重现问题:

#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;
}

在C++中,对于同一个参数/模板参数,不能多次提供默认参数或默认模板参数。来自函数的所有声明(包括定义)的默认[template]参数被组合(级联)。您应该从模板的定义中删除默认模板参数。

@Angew正是这样!你能创建一个aswer,这样我就可以接受它吗?
// 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);
};