使用 decltype 进行函数声明会导致定义函数时出现“冲突”

问题描述 投票:0回答:1

我正在使用

decltype
来确保模板函数
force2
与另一个模板函数
force1
具有相同的参数和返回类型,但它无法编译。我需要将函数模板化。 考虑这段代码:

template <typename N>
void force1(N a);

template <typename N>
using ForceType = decltype(force1<N>);

template <typename N>
ForceType<N> force2;

template <typename N>
void force2(N a)
{}

这会导致错误:

<source>:11:16: error: 'template<class N> void force2(N)' conflicts with a previous declaration
   11 | void force2(N a)
      |                ^
<source>:8:14: note: previous declaration 'template<class N> ForceType<N> force2<N>'
    8 | ForceType<N> force2;
      |              ^~~~~~
Compiler returned: 1

我期望它能够编译:

force2
是一个空主体的模板化函数。这里到底发生了什么?编译器提示
template<class N> void force2(N)
template<class N> ForceType<N> force2<N>
不同,我无法理解。乍一看它们确实不同,但
ForceType<N>
的扩展不应该导致
template<class N> void force2(N)
吗?

当我在

force2
的声明中使用具体类型时:

template <typename N>
void force1(N a);

template <typename N>
using ForceType = decltype(force1<N>);

ForceType<int> force2;

void force2(int a)
{}

编译没有错误。

c++ templates using decltype
1个回答
0
投票

using ForceType
模板声明中,
decltype(force1<N>)
void(N a)
。所以
ForceType<int> force2;
与声明
void force2(int a)
是一样的,它只是一个函数,而不是函数模板。

现在,在

template <typename N> void force2(N a) {}
中,您尝试声明一个名为
force2
的模板,该模板已被之前的声明“使用”。

注意,在第二个示例中,

void force2(int a) {}
是函数的定义,与
force2
声明不冲突。

© www.soinside.com 2019 - 2024. All rights reserved.