代码之家  ›  专栏  ›  技术社区  ›  Armen Michaeli

“类模板示例”是什么意思`语句的意思是C++11?

  •  8
  • Armen Michaeli  · 技术社区  · 6 年前

    有人提到过我 "Explicit Template Instantiation" cplusplus.com ,给出了以下示例:

    template <typename T> class Example
    {
    public:
        Example( T test )
        {
            _data = test;
        }
        void setTest(T test)
        {
            _data = T;
        }
    private:
        T _data;
    };
    
    class template Example<int>;
    class template Example<float>;
    class template Example<double>;
    

    除了在我看来似乎是一个遗漏错误,试图将类型分配给成员变量-- _data = T 而不是我认为应该是 _data = test --我不明白的是,最后3行声明或指示编译器做什么?

    我知道模板是什么,用它们构建了程序,并且大体上知道它们的实例化和专门化。我在理解后两个方面可能有一些漏洞,但我通常会使用例如。 template class Example<int>; 表单,而不是代码段中显示的表单。

    我尝试使用 g++ -std=c++11 -pedantic 它编译得很好,没有警告(我更正了 _date = T 第一个以上的错误)。

    这是在我发表评论之后 an answer to a related question 我仍然不确定代码段中的最后3行是模板专门化还是实例化。

    我还试图找到相关的语法产生式规则(允许 template 之后 class )在 C++11 draft published by ISO 但是空手而来。

    2 回复  |  直到 3 年前
        1
  •  11
  •   Shafik Yaghmour    6 年前

    我们可以从下面的螺栓中看到 example 根据clang和MSVC的说法,这是格式错误的,请查看 显式实例化 部分 [temp.explicit] 我认为gcc没有任何理由接受它。

    我认为这篇文章“可能”的主题是:

    template class Example<int>;
    template class Example<float>;
    template class Example<double>;
    

    确实如此 is well-formed with gcc/clang/MSVC .

    看起来C++11之前的版本允许使用此语法,请参见 defect report 1707: template in elaborated-type-specifier without nested-name-specifier ( 重点矿山 ):

    10.1.7.3[dcl.type.elab]中详细类型说明符的语法 部分内容如下:,

    elaborated-type-specifier:
        class-key nested-name-specifieropt templateopt simple-template-id
    

    允许在没有 嵌套名称说明符,例如结构模板。 这是 与模板关键字的其他用法不一致。可能是吧 最好将产品一分为二,只允许关键字 在嵌套名称说明符之后,

    ....

    所以这更有意义 with this comment 那个 -ansi 导致警告。

    其他的 answerer filed two bug reports .

    cppreference公司 has a good dicssuion of Explicit instantiation 这个问题 Explicit instantiation - when is it used? 解释了为什么这很有用的更多细节。

    另请注意,我们可以看到 Meta post: Links being changed to cppreference.com 已知该网站的信息不正确,通常社区倾向于 cppreference 作为可靠的C++参考。

        2
  •  9
  •   cpplearner    5 年前

    我在这里看到两个bug:

    1. GCC处理 template 关键字作为 template disambiguator ,因此认为 class template Example<int> 相当于 class Example<int> . 这是不正确的,因为C++语法只允许 样板 后面的消歧器 :: , . -> . (最初编写的C++11允许 类模板示例(<内部(>); ,但此问题已由修复 cwg 1707 .)
    2. GCC错误地允许如下声明 class Example<int>; . 虽然 类示例(<内部(>);; 匹配的语法 simple-declaration ,不符合中的要求 [dcl.dcl]/5 它规定一个简单的声明必须声明或重新声明某个内容(类/枚举/枚举器/类型定义/变量/函数)。

    据报道,前者为 GCC bug 87781 ,后者为 GCC bug 87783 .

    更新: GCC错误87781 现在由修复 r266285 .