2015-06-29 39 views
2

我需要有一个模板类。我想传递一个类型的模板,然后传递两个成员变量指针。第二个指针我想默认为NULL,因此是可选的。这是可能的,如果是这样的话是什么语法?默认成员变量指针时,其模板参数

我预计语法

template<typename T, int T::*VALUE1, int T::*VALUE2 = NULL> 
class Foo { ... } 

然而,当我试图实例化这个类的一个实例;

Foo<Bar, &Bar::var1> fooBar; 

虽然使用了以下工作

Foo<Bar, &Bar::var1, &Bar::var2> fooBar 

实例(从G ++ 4.4)给出的误差是

错误:无法模板参数 '0升' 转换为“廉政酒吧:: * '

请注意,我不能使用C++ 11,因此nullptr

+1

但是,当您尝试实例化(而不是煽动)...... _什么?它不会编译?编译器给出了什么错误? – Useless

+1

因为当你应该使用'nullptr'时使用'NULL' – CoffeeandCode

+0

nullptr会很好,但是我不能使用C++ 11所以不能使用它 – lachlan

回答

2

使用nullptr

struct Bar 
{ 
    int var1; 
}; 

template<typename T, int T::*VALUE1, int T::*VALUE2 = nullptr> 
struct Foo 
{ 

}; 

int main() 
{ 
    Foo<Bar, &Bar::var1> fooBar; 
    return 0; 
} 

活例如:https://ideone.com/2ICSBJ

+0

谢谢,但这样做不起作用,因为我不能使用C++ 11 – lachlan

0

如所解释here,指针类成员被用来提供到类成员的间接访问。现在为了声明对象foobar1需要一个类模板,它带有一个类栏的成员。

现在你的第二个调用是完全不同的类模板,它想要访问类Bar的两个成员。

所以,你必须定义两个不同的类模板说,为此目的foo1和foo2的,如下图所示:

template<typename T, int T::*VALUE1> 
    class Foo1 { ... } 

    template<typename T, int T::*VALUE1, int T::*value2> 
    class Foo2 { ... } 

你要给这些是这样的:

Foo1<Bar,&Bar::var1> foobar1;//use first class template Foo1 
    Foo2<Bar,&Bar::var1,&Bar::var2> foobar2;//use second class template Foo2 
+0

你指的是什么样的“功能”? –

+0

我编辑了我的答案我会回到它,当我将有机会获得一台电脑 –

+0

对不起,但没有回答我的问题,两次实施模板类将是一个维护问题。所以虽然可能需要这样做,但我希望能有一种语法来编写它。正如其他人所说,这确实存在于c + + 11通过nullptr,但我不能使用 – lachlan

3

这一限制自从时代开始以来一直是这种语言。在C++ 98中,不允许使用0作为指针类型或指针成员类型的任何模板参数的非类型模板参数。例如。这是无效的

template <int *p> struct S {}; 
... 
S<0> s1; // ERROR: `0` is not a valid argument for `int *` parameter 
S<(int *) 0> s2; // ERROR: unacceptable address expression 

换句话说,在C++语言的原始版本,你根本就没有允许通过空指针作为模板参数。它被语言作者故意阻止。这样做的机会仅在C++ 11中出现,引入了nullptr

+0

谢谢,那也是我的结论,但希望我错了。 – lachlan