未定义的类模板静态变量的引用

时间:2017-01-09 16:20:19

标签: c++ templates linker template-specialization

下面是我的代码:

TRUNC(F_EXTRACTO)

在尝试编译时,链接器返回错误: // types.h template <typename T> struct type_to_char {}; template <> struct type_to_char<char> { static constexpr char str[] = "baz"; }; // main.cpp #include <iostream> #include <string> #include "types.h" int main() { std::cout << type_to_char<char>::str << std::endl; return 0; }

我遇到了this answer,但我不知道如何在我的情况下应用它,因为模板没有编译。我应该在项目中放置一个单独的undefined reference to type_to_char<char>::str文件吗?

.cpp变量的声明和定义有什么区别?如果没有初始化程序,则无法声明此变量,那么为什么要在constexpr文件中放置单独的定义?

我希望对此有一些澄清

3 个答案:

答案 0 :(得分:2)

由于您完全专门化了一个类,因此在许多方面它的行为类似于未模板化的类。一个例子是它的静态成员必须在实现文件中实例化,就像非模板化类一样。

// header file (type.h)
template <typename T>
struct type_to_char {};

template <>
struct type_to_char<char> {
  static constexpr char str[] = "baz";
};

// impementation file (type.cpp)
constexpr char type_to_char <char>::str[];

// main.cpp
#include <iostream>
#include <type.h>

int main() {
    std::cout << type_to_char<char>::str << std::endl;
    return 0;
}

答案 1 :(得分:1)

您需要在最终程序中链接的.cpp中提供定义。例如:

   // types.h
    template <typename T>
    struct type_to_char {};

    template <>
    struct type_to_char<char> {
      static constexpr const char str[] = "baz";
    };


    // main.cpp
    #include <iostream>
    #include <string>
    #include "types.h"

    constexpr const char type_to_char <char>::str[]; 

    int main() {
      std::cout << type_to_char<char>::str << std::endl;
    }

答案 2 :(得分:0)

除非您为静态constexpr数据成员提供定义,否则不能使用静态constexpr数据成员。
尝试使用它的尝试就是当你尝试这样做时会发生的事情:

std::cout << type_to_char<char>::str << std::endl;

这就是为什么需要定义的原因 您可以轻松地重现问题:

struct S { static constexpr int x = 0; };
int main() { auto y = &S::x; (void)y; }

无论如何,在您的具体情况下,使用以下声明就足够了:

static constexpr char *str = "baz";

如果您可以使用它而不是数组类型,则不必明确定义type_to_char<char>::str