【问题标题】:What does this A<B>::c("d") construction mean? Name space with a template?这个 A<B>::c("d") 构造是什么意思?带有模板的命名空间?
【发布时间】:2013-04-10 07:34:40
【问题描述】:

看起来c 是一个以“d”作为参数的函数。我知道:: 用于指示名称空间及其子名称空间。但是A&lt;B&gt; 是什么意思?我知道B 是类。我也知道模板可以用于类、函数和结构。但在这个例子中,我们似乎使用了一个命名空间的模板。

【问题讨论】:

  • c是模板类A的静态函数。使用类型B 调用模板。函数c 接受参数d

标签: c++ templates syntax namespaces


【解决方案1】:

这意味着您有一个名为A 的类模板接受一个类型参数,并且您使用类型B 作为其类型参数来实例化该模板。

该类模板反过来定义了 (1) 一个静态成员 可调用对象 c(可能是一个常规函数),它接受一个字符串文字可转换为的类型,或 (2) 类型别名 c 用于可从字符串文字构造的类型(在这种情况下,您正在构造 temporary 的那种)。

在这两种情况下,您都可以使用与访问命名空间中定义的实体相同的范围解析运算符 (::) 访问定义在类模板 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");
}

作为 (1) 使用可调用对象而不是函数的另一个示例 (live example):

#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");
}

【讨论】:

    【解决方案2】:

    scope resolution operator:: 用于命名空间和完全限定成员。

    在您的示例中,c() 看起来像由A&lt;B&gt; 模板类公开的static method。静态成员在类外访问时必须是完全限定的。

    正如其他人正确指出的那样,c 也可以是可调用的静态成员(例如,覆盖operator()(const char *) 的类型的实例),或可从const char * 或公共@ 构造的类型的别名987654329@ 或 struct 嵌套在 A&lt;B&gt; 中,可从 const char * 构造。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2017-02-02
      • 2013-12-16
      • 2015-11-03
      • 2021-10-07
      相关资源
      最近更新 更多