RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 638092
Accepted
pank
pank
Asked:2020-03-11 19:03:05 +0000 UTC2020-03-11 19:03:05 +0000 UTC 2020-03-11 19:03:05 +0000 UTC

使用 typedef 实例化模板类

  • 772

有一个模板类A,我想用它制作两个具体的类:B和C

#include <iostream>
using namespace std;

template<const char* s = "hello">
class A {
public:
    void foo();
};

template<const char* s>
void A<s>::foo() {
    cout << s;
}

typedef A<" world"> B;

class C : public A<"!\n"> {};

int main() {
    A<"hello"> a;
    B b;
    C c;
    a.foo();
    b.foo();
    c.foo();
    return 0;
}

但我得到一个错误:

prog.cpp:15:19: error: ‘" world"’ is not a valid template argument for type ‘const char*’ because string literals can never be used in this context
 typedef A<" world"> B;
                   ^
prog.cpp:17:25: error: ‘"!\012"’ is not a valid template argument for type ‘const char*’ because string literals can never be used in this context
 class C : public A<"!\n"> {};
                         ^
prog.cpp: In function ‘int main()’:
prog.cpp:20:11: error: ‘"hello"’ is not a valid template argument for type ‘const char*’ because string literals can never be used in this context
  A<"hello"> a;
           ^
prog.cpp:23:4: error: request for member ‘foo’ in ‘a’, which is of non-class type ‘int’
  a.foo();
    ^~~
prog.cpp:24:4: error: request for member ‘foo’ in ‘b’, which is of non-class type ‘B {aka int}’
  b.foo();
    ^~~
prog.cpp:25:4: error: ‘class C’ has no member named ‘foo’
  c.foo();
    ^~~

ideone 上的代码。

如果模板中的 yA是整数而不是字符串,则代码可以正常工作。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Pavel Parshin
    2020-03-11T22:53:03Z2020-03-11T22:53:03Z

    使用模板非类型参数时有很多限制,包括:

    对于指向对象的指针,模板参数必须指定具有静态存储持续时间和链接(内部或外部)的对象的地址,或计算为适当的空指针或 std::nullptr_t 值的常量表达式。

    此限制意味着字符串文字不能用作模板参数:

    特别是,这意味着字符串文字、数组元素的地址和非静态成员的地址不能用作模板参数来实例化模板,其对应的非类型模板参数是指向对象的指针。

    因为他们既没有内部链接也没有外部链接。这意味着该标准不保证将相同的字符串文字放置在同一地址,将实现的选择留给编译器实现者。因此,A<"hello"> a;在不同的代码片段中使用可能会导致不同模板的实例化。


    处理了错误的原因后,我们可以尝试修复它:我们需要将指向具有静态存储持续时间和内部或外部链接的对象的指针作为模板参数传递。

    #include <iostream>
    using namespace std;
    
    template<const char* s>
    class A {
        public:
            void foo() {
                cout << s << "\n";
            }
    };
    
    extern const char p[];
    const char p[] = "earth";
    
    extern const char str[];
    const char str[] = "world";
    
    template<>
    class A<str> {
        public:
            void foo() {
                cout << "partial specialization: " << str << "\n";
            }
    };
    
    using B = A<str>;
    
    int main() {
        A<p> a;
        B b;
        a.foo();
        b.foo();
        return 0;
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5