std::declval vs crtp,无法从不完整的类型中推断方法 return 类型
std::declval vs crtp, cannot deduce method return type from incomplete type
我正在尝试做这样的事情(在 c++11 中):
#include <utility>
template <typename T>
struct base {
using type = decltype( std::declval<T>().foo() );
};
struct bar : base<bar> {
int foo() { return 42;}
};
int main() {
bar::type x;
}
失败
prog.cc: In instantiation of 'struct base<bar>':
prog.cc:8:14: required from here
prog.cc:5:46: error: invalid use of incomplete type 'struct bar'
using type = decltype( std::declval<T>().foo() );
~~~~~~~~~~~~~~~~~~^~~
prog.cc:8:8: note: forward declaration of 'struct bar'
struct bar : base<bar> {
^~~
如何在 base
中为 bar::foo
的 return 类型声明一个别名?不可能吗?
这个问题似乎很相关:,尽管我无法将那里给出的答案应用到我的案例中。
可以将type
做成模板类型的别名,方便用户在bar
的定义可用后实例化。这会将最终语法从 bar::type
更改为 bar::type<>
。
template <typename T>
struct base {
template <typename G = T>
using type = decltype( std::declval<G>().foo() );
};
struct bar : base<bar> {
int foo() { return 42;}
};
int main() {
bar::type<> x;
}
我正在尝试做这样的事情(在 c++11 中):
#include <utility>
template <typename T>
struct base {
using type = decltype( std::declval<T>().foo() );
};
struct bar : base<bar> {
int foo() { return 42;}
};
int main() {
bar::type x;
}
失败
prog.cc: In instantiation of 'struct base<bar>':
prog.cc:8:14: required from here
prog.cc:5:46: error: invalid use of incomplete type 'struct bar'
using type = decltype( std::declval<T>().foo() );
~~~~~~~~~~~~~~~~~~^~~
prog.cc:8:8: note: forward declaration of 'struct bar'
struct bar : base<bar> {
^~~
如何在 base
中为 bar::foo
的 return 类型声明一个别名?不可能吗?
这个问题似乎很相关:
可以将type
做成模板类型的别名,方便用户在bar
的定义可用后实例化。这会将最终语法从 bar::type
更改为 bar::type<>
。
template <typename T>
struct base {
template <typename G = T>
using type = decltype( std::declval<G>().foo() );
};
struct bar : base<bar> {
int foo() { return 42;}
};
int main() {
bar::type<> x;
}