3

我正在编写一个带有一个类型参数和一个布尔值的模板类,这里是代码:

template<class T, bool p = true>
class A
{
private:
    T* ptr;
public:
    A();
};


template<class T>
A<T,true>::A()
{
    ptr = 0xbaadf00d;
}

int main()
{
    A<int> obj;
    A<int, false> o;
    return(0);
}

我收到了这些编译错误:

Error   1   error C3860: template argument list following class template name must list parameters in the order used in template parameter list tst.cpp 15
Error   2   error C2976: 'A<T,p>' : too few template arguments  tst.cpp 15

我究竟做错了什么?还是出于某种原因禁止部分专门化非类型参数?

同时,如果我在 if 语句中使用布尔参数,我会收到以下警告:

Warning 1   warning C4127: conditional expression is constant

所以我应该为这种事情做专业化......

任何帮助将不胜感激!:)

提前致谢!!!!

4

2 回答 2

7

您正在尝试部分专门化一种方法。这是不允许的。您只能对整个班级进行部分专业化。一旦您专门化了该类,您就可以为部分专门化的类提供方法的非专门化定义。

以下是一些可能执行您想要的代码的示例:

template<class T, bool p = true>
class A
{
private:
    T* ptr;
public:
    A();
};

template <class T>
class A<T,true> {
private:
    T* ptr;
public:
    A();
};


template <class T>
class A<T,false> {
private:
    T* ptr;
public:
    A();
};

template<class T>
A<T,true>::A()
{
    ptr = reinterpret_cast<T *>(0xbaadf00d);
}

template<class T>
A<T,false>::A()
{
    ptr = 0;
}

int main()
{
    A<int> obj;
    A<int, false> o;
    return(0);
}
于 2012-06-20T21:36:56.117 回答
6

欢迎您专注于非类型模板参数,但您不能只专注于模板类的一个功能。类是模板,所以是你需要专攻的也就是说,要给构造函数一个特殊的定义,就需要对整个类提供一个特殊的定义。

于 2012-06-20T21:36:24.943 回答