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

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)


Fré*_*idi 7

范围解析操作符 ::与命名空间和完全合格的成员使用二者.

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

正如其他理所当然指出,c也可以是一个可调用的静态成员(例如,重写的类型的实例operator()(const char *)),或从一个别名的类型constructible const char *,或公共classstruct嵌套在A<B>是从constructible const char *.

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