我在 C++ 项目中使用模板,并且在使用模板类型作为模板模板参数时遇到问题。我认为描述它的最好方法是给出一个产生错误的例子:
template <template<class> class P, typename T>
class Foo {
P<T> baz;
};
template <class T>
class Bar {
Foo<Bar, T> memberFoo;
void makeFoo() {
Foo<Bar, T>* f = new Foo<Bar, T>();
}
};
Foo<Bar, int> globalFoo;
globalFoo
的声明不会导致错误,但 memberFoo
和 f
的声明会导致编译器错误:
error: template argument for template template parameter must be a class template or type alias template
仅当在 Bar 类声明中使用 Bar 作为模板参数时才会发生该错误,但同时使用 clang 和 g++ 时也会发生该错误。这似乎会在某个地方记录下来,但谷歌搜索没有产生任何问题或其他文档。
模板的这种使用在 C++ 中是不合法的,还是我误解了如何定义和使用模板?如果 C++11 标准不允许这种设计架构,我可以使用什么解决方法?
最佳答案
问题是在实例化时生成不完整的类型。 Clang 和 G++ 会产生不同的错误,因为 Clang(显然)没有实现 C++11 规则,即注入(inject)的类名在用作模板模板参数时可以引用类模板本身(顺便说一句,Igor 的建议不起作用。)改变Bar
至::Bar
修复了这个错误,这使得 Clang 像 G++ 一样指出不完整的错误。改变baz
至P<T>*
允许其编译。
注意即使它编译,它可能是未定义的行为。我建议重新设计您的类(class)。
关于c++ - 在成员变量中使用模板类作为模板模板参数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34834301/