c++ - 在成员变量中使用模板类作为模板模板参数时出错

标签 c++ templates c++11

我在 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 的声明不会导致错误,但 memberFoof 的声明会导致编译器错误:

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++ 一样指出不完整的错误。改变bazP<T>*允许其编译。

注意即使它编译,它可能是未定义的行为。我建议重新设计您的类(class)。

关于c++ - 在成员变量中使用模板类作为模板模板参数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34834301/

相关文章:

c++ - 在 Boost::Python 中通过引用传递

c++ - 为什么在使用模板时不能使用前向声明?

c++ - gcc 的 std::bind 在哪里将参数复制到数据结构中?

c++ - 从现有 istream 或类本身创建的 istream 初始化成员 istream

c++ - 使用模板在编译时初始化数组指针的 const vector

c++ - 杂乱的函数指针 : how to remove the warning?

c++ - 为什么tellp() 是一个非常量?

c++ - CUDA - cudaMallocPitch 和 cudaMemcpy2D 使用,错误 : InvalidValue, InvalidPitchValue

c++ - 我应该总是在头文件中定义我的整个模板类吗?

Azure 资源管理器 SQL 数据库模板