5
4

2 回答 2

10

这意味着您有一个名为A接受类型参数的类模板,并且您使用类型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");
}

作为(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)的示例(现场示例):

#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");
}
于 2013-04-10T07:42:23.893 回答
7

范围解析运算符 ::与命名空间和完全限定成员一起使用。

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

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

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

于 2013-04-10T07:36:36.927 回答