gpt4 book ai didi

c++ - std::enable_if 在模板类中的同名函数上使用时产生错误

转载 作者:行者123 更新时间:2023-12-01 14:10:37 27 4
gpt4 key购买 nike

问题描述
我正在尝试调用一个返回 1 的函数或 2取决于类型是否为signed charunsigned int .
为此,我编写了以下代码。如果我编译没有 main 中的代码的代码.我没有得到编译错误。
但是当我用对象的实例化编译代码时 Coverage ,我收到以下编译错误:

main.cpp: In instantiation of ‘class Coverage<unsigned char>’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',27)">main.cpp:27:28</span>: required from here
main.cpp:12:9: error: no type named ‘type’ in ‘struct std::enable_if’
int getNb(typename std::enable_if<std::is_signed<T>::value, void>::type) {
^~~~~
main.cpp:17:9: error: invalid parameter type ‘std::enable_if::type {aka void}’
int getNb(typename std::enable_if<std::is_unsigned<T>::value, void>::type) {
^~~~~
main.cpp:17:9: error: in declaration ‘int Coverage::getNb(typename std::enable_if::value, void>::type)’
main.cpp: In function ‘int main()’:
main.cpp:28:18: error: ‘class Coverage’ has no member named ‘getNb’
std::cout << c.getNb() << std::endl;
我明白,当我们添加 typename std::enable_if作为函数参数,它没有被考虑在内。当我们有同名的成员函数时,它也是唯一的使用方式。

源代码
#include <iostream>
#include <type_traits>

template<typename T>
class Coverage
{
public:
Coverage(T type) :_type(type) {}

// signed char
int getNb(typename std::enable_if<std::is_signed<T>::value, void>::type) {
return 1;
}

// unsigned int
int getNb(typename std::enable_if<std::is_unsigned<T>::value, void>::type) {
return 2;
}

private:
T _type;
};

int main()
{
Coverage<unsigned char> c('c');
std::cout << c.getNb() << std::endl;
return 0;
}

最佳答案

就像@Evg 提到的那样,您还必须对成员函数进行模板化。
此外,您需要为它们提供默认值,就像通常的 nullptr违约。
See a demo

#include <iostream>
#include <type_traits>

template<typename T>
class Coverage {
public:
Coverage(T type) :_type(type) {}

//signed char
template<typename Type = T> // templated the member!
int getNb(typename std::enable_if<std::is_signed<Type>::value, void>::type* = nullptr)
{
return 1;
}

//unsigned int
template<typename Type = T> // templated the member!
int getNb(typename std::enable_if<std::is_unsigned<Type>::value, void>::type* = nullptr)
{
return 2;
}
};

或提供 trailing return各功能SFINAE
See a demo
#include <iostream>
#include <type_traits>

template<typename T>
class Coverage {
public:
Coverage(T type) :_type(type) {}

template<typename Type = T>
auto getNb() -> typename std::enable_if<std::is_signed<Type>::value, int>::type
{
return 1;
}


template<typename Type = T>
auto getNb() -> typename std::enable_if<std::is_unsigned<Type>::value, int>::type
{
return 2;
}

private:
T _type;
};

关于c++ - std::enable_if 在模板类中的同名函数上使用时产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63015173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com