拥有constexpr静态字符串会产生链接器错误

时间:2016-01-14 14:46:27

标签: c++ string c++11 constexpr typetraits

以下程序给出了链接时错误:

1900

错误消息是

#include <iostream>

struct Test { static constexpr char text[] = "Text"; };

int main()
{
    std::cout << Test::text << std::endl; // error: undefined reference to `Test::text'
}

确定。让我们试着解决这个问题:我在/tmp/main-35f287.o: In function `main': main.cpp:(.text+0x4): undefined reference to `Test::text' main.cpp:(.text+0x13): undefined reference to `Test::text' clang: error: linker command failed with exit code 1 (use -v to see invocation) 正文之外添加了一个定义:

struct

Clang给出了以下错误消息。

#include <iostream>

struct Test { static constexpr char text[] = "Text"; };
constexpr char Test::text[] = "Text";

int main()
{
    std::cout << Test::text << std::endl;
}

哦,好吧,我想,现在我知道你想要什么:

main.cpp:4:35: error: static data member 'text' already has an initializer
    constexpr char Test::text[] = "Text";
                                  ^
main.cpp:3:50: note: previous initialization is here
    struct Test { static constexpr char text[] = "Text"; };

又一次错误:

#include <iostream>

struct Test { static constexpr char text[]; };
constexpr char Test::text[] = "Text";

int main()
{
    std::cout << Test::text << std::endl;
}

狗咬自己的尾巴。 :(

有没有办法使用在类中声明的编译时常量字符数组?我想要一个类中的数据的原因是我需要一个类型特征类来帮助我做模板的东西。

2 个答案:

答案 0 :(得分:8)

应该工作:

#include <iostream>

struct Test { static constexpr char text[] = "Text"; };
constexpr char Test::text[];

int main()
{
    std::cout << Test::text << std::endl;
}

在标准(n4140§9.4.2/ 3)中,您可以找到:

  

可以在类中声明文字类型的静态数据成员   constexpr说明符的定义 ;如果是的话,其声明应   指定一个brace-or-equal-initializer,其中包含每个initializer子句   这是一个赋值表达式是一个常量表达式。 [注意:在   在这两种情况下,成员都可能出现在常量表达式中。 -结束   note] 如果成员仍然在命名空间范围内定义   程序中的odr-used(3.2)和命名空间范围定义应该   不包含初始化程序

答案 1 :(得分:2)

正如评论中所述,此版本运行良好:

from tkinter import *

from tkinter.messagebox import *

def show_answer():
    Ans = int(num1.get()) + int(num2.get())
    ans.set(Ans)

    lsum["text"] = "The sum is: " + str(ans)
    Entry(main,  text = "%s" %(ans) ).grid(row=2, column=1)


main = Tk() Label(main, text = "Enter Num 1:").grid(row=0) Label(main, text = "Enter Num 2:").grid(row=1) Label(main, text = "The Sum is:").grid(row=2)


num1 = Entry(main) num2 = Entry(main) blank = Entry(main)


num1.grid(row=0, column=1) num2.grid(row=1, column=1) blank.grid(row=2, column=1)


Button(main, text='Quit', command=main.quit).grid(row=4, column=0, sticky=W, pady=4) Button(main, text='Show', command=show_answer).grid(row=4, column=1, sticky=W, pady=4)

lsum = Tk.Label(master, text = 'The sum is:')
lsum.grid(row=5, column=1, sticky=W, pady=4)

mainloop()

struct Test { static constexpr auto text = "Text"; }; 将是text而不是const char*