【发布时间】:2014-01-10 15:36:27
【问题描述】:
我有以下情况:-
template<typename Derived, typename ValType>
class foo
{
public:
template<typename R>
bar<typename std::vector<R>::const_iterator> select()
{
std::vector<R> translation;
return bar<typename std::vector<R>::const_iterator>(std::move(translation));
}
};
template<typename T>
class bar
: public foo<bar<T>, typename std::iterator_traits<T>::value_type>
{
public:
bar(std::vector<typename std::iterator_traits<T>::value_type>&& vec)
{
}
};
这基本上是我正在使用 CRTP 和 foo 作为 mixin 的一个小概念证明。
问题是我认为我应该使用前向声明,但是我尝试了以下方法:-
class bar; // I didn't expect this to work
但是我确实希望这会起作用:-
template<typename R>
class bar;
在我真正调用 select() 之前编译得很好
std::vector<int> enumerable_vector;
enumerable_vector.push_back(1);
enumerable_vector.push_back(2);
bar<typename std::vector<int>::const_iterator> baz(std::move(enumerable_vector));
baz.select<std::string>();
这会导致以下错误:-
错误错误C2027:使用未定义类型 'foo::bar'
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
它适用于 GCC 和 Clang,因为前向声明您期望工作。
-
@Daniel Frey 你在 baz 上调用 select() 吗?
-
是的,只需点击我评论中的链接。
-
我将前向类声明放入 foo.我认为它只会在这种情况下适用于本地,但下面的答案解决了问题