相关疑难解决方法(0)

函数定义中的decltype中的依赖类型或参数在没有decltype的情况下声明时无法编译

我一直在玩定义中的推断返回类型,它们解析为与声明相同的类型.这有效:

template <typename>
struct Cls {
  static std::size_t f();
};

template <typename T>
decltype(sizeof(int)) Cls<T>::f()  { return 0; }
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改定义的东西,应该更换等同sizeof(int)sizeof(T) 失败

template <typename T>
decltype(sizeof(T)) Cls<T>::f() { return 0; }
Run Code Online (Sandbox Code Playgroud)

gcc的错误(clang几乎相同):

error: prototype for ‘decltype (sizeof (T)) Cls<T>::f()’ does not match any in class ‘Cls<T>’
 decltype(sizeof(T)) Cls<T>::f() { return 0; }
                     ^~~~~~
so.cpp:4:24: error: candidate is: static std::size_t Cls<T>::f()
     static std::size_t f();
                        ^
Run Code Online (Sandbox Code Playgroud)

函数参数类型出现同样的问题:

template <typename>
struct Cls {
  static void f(std::size_t);
};

template <typename T>
void …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer c++11

28
推荐指数
1
解决办法
786
查看次数

将 std::enable_if 与外部成员函数和模板化静态成员条件一起使用

我想使用 SFINAE 创建一个带有Consumer函子的模板化成员函数。某个东西是否是消费者取决于模板化的static constexpr bool isConsumer成员变量。我已将代码简化为以下示例:

#include <type_traits>

template <typename T>
struct Container {
    T data[100];

    template <typename Consumer>
    static constexpr bool isConsumer = std::is_invocable_r_v<void, Consumer, T>;

    template <typename Consumer, std::enable_if_t<isConsumer<Consumer>, int> = 0>
    void forEach(const Consumer &consumer);
};

template <typename T>
template <typename Consumer, std::enable_if_t<Container<T>::template isConsumer<Consumer>, int>>
void Container<T>::forEach(const Consumer &consumer)
{
    for (int i = 0; i < 100; ++i) {
        consumer(data[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我不理解的原因,这不会编译:

<source>:16:20: error: out-of-line definition of 'forEach' does not match …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae enable-if c++17

5
推荐指数
1
解决办法
129
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

c++17 ×1

enable-if ×1

language-lawyer ×1

sfinae ×1