问问题
288 次
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 回答