【发布时间】:2021-12-31 12:12:37
【问题描述】:
考虑以下基本类模板:
#include <type_traits>
template < typename T >
class A {
public:
A() = default;
T obj;
template < typename U = T, typename = typename std::enable_if< !std::is_void< U >::value >::type >
T& get();
};
我正在使用 <type_traits> 来获得一个简单的 SFINAE 实现,如果模板参数为 void,它会隐藏 get()。
但是,我仍然收到 void 类型 error: forming reference to void 的编译器错误,我不确定原因是什么。类声明语法有什么问题吗?
int main(int argc, char const *argv[]) {
A<int> b;
A<void> t; // error: forming reference to void
return 0;
}
编辑:有人指出,问题在于obj 不能无效。一种解决方法是改用指针:
#include <type_traits>
#include <memory>
template < typename T >
class A {
public:
A() = default;
std::shared_ptr< T > obj;
template < typename U = T, typename = typename std::enable_if< !std::is_void< U >::value >::type >
U& get() { return *obj; };
};
但我仍然得到error: forming reference to void,这意味着编译器仍在尝试编译get()。
【问题讨论】:
-
问题不是函数声明,而是成员变量
T。在 C++ 中,变量不能具有void类型。 -
你想达到什么目的?
-
当
T为void时,您不能拥有T obj,因此禁用get对您没有任何好处。 -
@Elliott 同意!
-
我 cannot reproduce 你的错误解决方法。