看起来c
是一个以“d”为参数的函数。我知道::
用于表示名称空间及其子名称空间。但A<B>
是什么意思?我知道B
是班级。我也知道模板可以用于类,函数和结构。但在这个例子中,我们看起来像是使用模板作为名称空间。
答案 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
中的公开struct
或A<B>
,可以const char *
构建。
(在后两种情况下,该类型的构造函数仅因其副作用而被调用,因为创建的实例不存储在任何地方。)