这个A <b> :: c(“d”)结构是什么意思?用模板命名空间?</b>

时间:2013-04-10 07:34:41

标签: c++ templates syntax namespaces

看起来c是一个以“d”为参数的函数。我知道::用于表示名称空间及其子名称空间。但A<B>是什么意思?我知道B是班级。我也知道模板可以用于类,函数和结构。但在这个例子中,我们看起来像是使用模板作为名称空间。

2 个答案:

答案 0 :(得分:10)

这意味着您有一个名为A的类模板接受一个类型参数,并且您将该模板实例化为类型B作为其类型参数。

该类模板反过来定义(1)静态成员可调用对象 c(可以是常规函数),它接受一个对象字符串文字可转换为的类型,或者(2)类型别名c,用于可从字符串文字构造的类型(在这种情况下,您构造的是< em>临时该类型。)

在这两种情况下,您都可以使用相同的范围解析运算符(A)访问在类模板::内定义的实体,该运算符将用于访问命名空间内定义的实体(毕竟, 类和命名空间都定义了范围)。

作为(1)live example)的一个例子:

#include <iostream>

struct B { };

template<typename T>
struct A
{
    static void c(const char* s) { std::cout << s; }
};

int main()
{
    A<B>::c("d");
}

作为使用可调用对象而不是函数(live example)的(1)的另一个示例:

#include <iostream>

struct B { void operator () (const char* c) { std::cout << c;  } };

template<typename T> 
struct A
{
    static T c;
};

template<typename T>
T A<T>::c;

int main()
{
    A<B>::c("d");
}

作为(2)live example)的一个例子:

#include <iostream>

struct B { B(const char* s) { std::cout << s; } };

template<typename T> 
struct A
{
    typedef T c;
};

int main()
{
    A<B>::c("d");
}

答案 1 :(得分:7)

scope resolution operator ::用于名称空间和完全限定的成员。

在您的示例中,c()看起来像A<B>模板类公开的static method。静态成员在课堂外访问时必须完全合格。

正如其他人正确指出的那样,c也可以是可调用的静态成员(例如,覆盖operator()(const char *)的类型的实例),或者是const char *中可构造类型的别名嵌套在class中的公开structA<B>,可以const char *构建。

(在后两种情况下,该类型的构造函数仅因其副作用而被调用,因为创建的实例不存储在任何地方。)