Rom*_*man 5 c++ syntax templates namespaces
它看起来像是c一个以"d"为参数的函数.我知道这::用于表示名称空间及其子名称空间.但是什么A<B>意思?我知道那B是上课.我也知道模板可以用于类,函数和结构.但在这个例子中,我们看起来像是使用模板作为名称空间.
And*_*owl 10
这意味着您有一个名为A接受类型参数的类模板,并使用type B作为其类型参数来实例化该模板.
反过来,该类模板定义(1)静态成员可调用对象 c(可以是常规函数),它接受字符串文字可转换为的类型的对象,或(2)类型的类型别名c.可以从字符串文字构造(在这种情况下,您正在构造该类型的临时文件).
在这两种情况下,您都可以A使用相同的范围解析运算符(::)来访问类模板中定义的实体,该运算符将用于访问在命名空间内定义的实体(毕竟,类和命名空间都定义了范围).
作为(1)(实例)的一个例子:
#include <iostream>
struct B { };
template<typename T>
struct A
{
static void c(const char* s) { std::cout << s; }
};
int main()
{
A<B>::c("d");
}
Run Code Online (Sandbox Code Playgroud)
作为(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");
}
Run Code Online (Sandbox Code Playgroud)
作为(2)(实例)的一个例子:
#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");
}
Run Code Online (Sandbox Code Playgroud)