Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在运行时获取/设置模板结构的静态成员_C++_Templates_Static - Fatal编程技术网

C++ 在运行时获取/设置模板结构的静态成员

C++ 在运行时获取/设置模板结构的静态成员,c++,templates,static,C++,Templates,Static,我试图在运行时存储关于一个具有静态成员的模板结构的类的信息,但是如果没有错误,我无法获取或设置静态成员 为什么这个代码不起作用 template <typename T> struct InfoHolder { static const char* name; }; int main() { InfoHolder<int>::name = "This is an integer"; cout << InfoHolder<

我试图在运行时存储关于一个具有静态成员的模板结构的类的信息,但是如果没有错误,我无法获取或设置静态成员

为什么这个代码不起作用

template <typename T>
struct InfoHolder
{
    static const char* name;    
};

int main()
{
    InfoHolder<int>::name = "This is an integer";
    cout << InfoHolder<int>::name << endl;

    return 0;
}
模板
结构信息持有者
{
静态常量字符*名称;
};
int main()
{
InfoHolder::name=“这是一个整数”;

如果出现链接器错误,则无法执行。必须在某个位置定义
name
变量。(在类中声明它不会在任何位置分配它,因为它不是对象的一部分)

在课程结束后,在main之前写下:

template <typename T>
const char *InfoHolder<T>::name;
模板
const char*InfoHolder::name;

这对静态数据成员来说是一个小小的不便。

我看到它在其他地方被使用

由于未分配结构中的静态成员,因此我可以使用函数中的静态成员,并返回变量指针

template <typename T>
struct InfoHolder
{
    static const char** getName()
    {
        static const char* name;
        return &name;
    }
};

int main()
{
    *InfoHolder<int>::getName() = "This is an integer";
    *InfoHolder<MyClass>::getName() = "This is an MyClass";
    *InfoHolder<OtherClass>::getName() = "This is an OtherClass";
    cout << *InfoHolder<int>::getName() << endl;
    cout << *InfoHolder<MyClass>::getName() << endl;
    cout << *InfoHolder<OtherClass>::getName() << endl;
}
模板
结构信息持有者
{
静态常量字符**getName()
{
静态常量字符*名称;
返回&名称;
}
};
int main()
{
*InfoHolder::getName()=“这是一个整数”;
*InfoHolder::getName()=“这是一个MyClass”;
*InfoHolder::getName()=“这是另一个类”;
库特