0

我正在尝试拥有一个从另一个模板类(此处为 A)继承的模板类(此处为 C)并执行静态成员专业化(此处为 int var),但我无法获得正确的语法(如果可能的话)

#include <iostream>

template<typename derived>
class A
{
    public:
        static int var;
};

//This one works fine
class B
    :public A<B>
{
    public:
        B()
        {
            std::cout << var << std::endl;
        }
};
template<>
int A<B>::var = 9;

//This one doesn't works
template<typename type>
class C
    :public A<C<type> >
{
    public:
        C()
        {
            std::cout << var << std::endl;
        }
};
//template<>
template<typename type>
int A<C<type> >::var = 10;

int main()
{
    B b;
    C<int> c;
    return 0;
}

我举了一个与非模板类(此处为 B)一起使用的示例,并且我可以获得 var 的静态成员特化,但对于 C 来说这不起作用。

这是 gcc 告诉我的:

test.cpp: In constructor ‘C<type>::C()’:
test.cpp:29:26: error: ‘var’ was not declared in this scope
test.cpp: At global scope:
test.cpp:34:18: error: template definition of non-template ‘int A<C<type> >::a’

我正在使用 gcc 4.6.3 版,感谢您的帮助

4

2 回答 2

0

我建议您在父类中使用枚举并将子类的值设置为父类的模板参数。对于 C 类来“看到”var,它可以被限定。见下文:

#include <iostream>
using namespace std;

template<typename Child, int i = 0> // 0 is the default value
class A
{
    public:
        enum { var = i };
};

class B
    :public A<B>   // define the value or var here
{
    typedef A<B> Parent;
public:
    B()
    {
        cout << Parent::var << endl; // Parent:: here IS NOT necessary, just for uniformity's sake
    }
};

template<typename type>
class C
    :public A<C<type>, 200>  // define the value of var here
{
    typedef A<C<type>, 200> Parent;
public:
    C()
    {
        cout << Parent::var << endl; // Parent:: here IS necessary
    }
};


int main()
{
    cout << B::var << endl;
    cout << C<int>::var << endl;
    cout << C<char>::var << endl;
}
于 2012-07-11T10:10:19.367 回答
0

您可以通过编写来提示编译器var是成员变量this->var

您不能编写模板来定义模板专业化的静态成员A<C<type>>;当您定义一个静态成员时,您正在保留存储空间,但编写模板部分特化不会告诉编译器要为哪些完整特化保留存储空间。你能做的最好的就是写

template<>
int A<C<int> >::var = 10;

另一种方法是使用通过模板函数访问的函数级静态:

template<typename T> class A {
    static int &var() { static int var; return var; }
};
于 2012-07-11T09:11:31.577 回答