3

嗨,我正在尝试使我的代码在 clang 3.2-9 下编译,这是我无法编译的简化示例:

template<template <class>class Derived, typename Type>
class Foo
{
    public:
        Foo(){}
};

template<typename Type>
class Bar
    : public Foo<Bar, Type>
{
    public:
        Bar()
            : Foo<Bar, Type>()
        {}
};

int main()
{
    Bar<int> toto;
}

这是clang告诉我的错误:

test.cpp:14:19: error: template argument for template template parameter must be a class template
            : Foo<Bar, Type>()
                  ^
test.cpp:14:15: error: expected class member or base class name
            : Foo<Bar, Type>()
              ^
test.cpp:14:15: error: expected '{' or ','
3 errors generated.

它在 gcc 4.7.2 下编译没有任何问题。而且我无法获得正确的语法以使其在clang下工作。谁能帮帮我,我有点卡住了......

4

1 回答 1

5

只需为您的类模板使用完全限定名称:

template<template <class> class Derived, typename Type>
class Foo
{
    public:
        Foo(){}
};

template<typename Type>
class Bar
    : public Foo<::Bar, Type>
//               ^^^^^
{
    public:
        Bar()
            : Foo<::Bar, Type>()
//                ^^^^^
        {}
};

int main()
{
    Bar<int> toto;
}

问题在于,在内部Bar,名称Bar是指类本身,即类模板(即)的实例化,而不是模板本身。BarBar<Type>

您可以在此处查看此示例的编译。

于 2013-03-06T10:55:37.533 回答