我通过定义操作结果的数据类型而遇到麻烦。 在下面的示例中,我需要具有模板类的实例 模板类型“int”。
我希望以下表达式导致int,但它没有!
typename A and B are both int
decltype( declval<A>+declval<B>)
以下是完整示例:
#include <utility>
using namespace std;
template <typename T>
class AV
{
};
template <typename T>
class Term
{
};
template <class A, class B>
auto operator +( AV<A>& a, AV<B>& b )->Term< int >
{
Term< decltype(declval<A>+declval<B>) >t(&a,&b);
// ~~~~~~~~~~~~~~~~~~~~~~ invalid operands of types
// '<unresolved overloaded function type>
return t;
}
int main()
{
AV<int> a;
AV<int> b;
Term<int> x(a+b);
}
导致以下错误(gcc 4.8.2)
main.cpp: In instantiation of 'Term<int> operator+(AV<A>&, AV<B>&) [with A = int; B = int]':
main.cpp:47:23: required from here
main.cpp:39:111: error: invalid operands of types '<unresolved overloaded function type>' and '<unresolved overloaded function type>' to binary 'operator+'
template <class A, class B> auto operator +( AV<A>& a, AV<B>& b )->Term< int > { Term< decltype(declval<A>+declval<B>) >t(&a,&b); return t; }
^
main.cpp:39:111: error: invalid operands of types '<unresolved overloaded function type>' and '<unresolved overloaded function type>' to binary 'operator+'
make: *** [go] Error 1
答案 0 :(得分:4)
declval<T>
是一个功能。你必须调用它,形成值表达式以赋予decltype
试
Term< decltype(declval<A>()+declval<B>()) >t(&a,&b);