gpt4 book ai didi

c++ - 了解 "template argument is invalid"错误消息

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:58 25 4
gpt4 key购买 nike

考虑代码:

#include <type_traits>
#include <iostream>

struct test1 {
void Invoke() {};
};

struct test2 {
template<typename> void Invoke() {};
};


enum class InvokableKind {
NOT_INVOKABLE,
INVOKABLE_FUNCTION,
INVOKABLE_FUNCTION_TEMPLATE
};

template<typename Functor, class Enable = void>
struct get_invokable_kind {
const static InvokableKind value = InvokableKind::NOT_INVOKABLE;
};

template<typename Functor>
struct get_invokable_kind<
Functor,
decltype(Functor().Invoke())
>
{
const static InvokableKind value = InvokableKind::INVOKABLE_FUNCTION;
};

template<typename Functor>
struct get_invokable_kind<
Functor,
decltype(Functor().Invoke<void>())
>
{
const static InvokableKind value = InvokableKind::INVOKABLE_FUNCTION_TEMPLATE;
};


int main() {
using namespace std;

cout << (get_invokable_kind<test1>::value == InvokableKind::INVOKABLE_FUNCTION) << endl;
cout << (get_invokable_kind<test2>::value == InvokableKind::INVOKABLE_FUNCTION_TEMPLATE) << endl;

}

我想做的是创建一个元函数来测试“可调用性”的特定定义。现在我被困在这个 compilation error 上了在 GCC 4.5.3 上:

prog.cpp:37:3: error: template argument 2 is invalid

这是什么意思?为什么我可以专攻decltype(Functor().Invoke()) , 但不能在 decltype(Functor().Invoke<void>())

最佳答案

由于解析歧义,您需要使用 template 对其进行限定:

 decltype(Functor().template Invoke<void>())
^^^^^^^^

相关:Where and why do I have to put the "template" and "typename" keywords?

此外,考虑使用 std::declval 而不是 Functor() 构造函数。

关于c++ - 了解 "template argument is invalid"错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344897/

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