【发布时间】:2017-03-27 03:23:03
【问题描述】:
我正在尝试这样做,但它无法编译。我想要做的是定义一个模板类专业化实现。并创建它的类型。我可以用 int 类型来做,但是当我尝试使用字符串时遇到了很多麻烦。。
#include <iostream>
using namespace std;
template <char const *str>
struct X
{
};
constexpr char global_string[] = "String";
template<>
struct X<global_string>
{
typedef int mytype;
const char *GetString() const
{
return global_string;
}
};
constexpr char version_use[] = "String";
int main()
{
using X1= X<version_use> ;
X1::mytype t = 1;
//X1 x;
//cout<<x.GetString() << " " << t;
}
sh-4.2$ g++ -std=c++11 -o main *.cpp
main.cpp: In function 'int main()':
main.cpp:27:5: error: 'mytype' is not a member of 'X1 {aka X<((const char*)(& version_use))>}'
X1::mytype t = 1;
^
main.cpp:27:16: error: expected ';' before 't'
X1::mytype t = 1;
【问题讨论】:
-
因为
global_string和version_use是不同的东西;当衰减到指针时,它们指向不同的地址,即它们具有不同的值。 -
这是否意味着我不能用字符串模板类型做我想做的事?
-
如果要根据c风格字符串的内容来做(即
char *),是的,不可能。 -
您可以使用文字类型名称代替字符串,但也可以使用 typeid(T).name() 在编译时获取字符串。
-
如果你想专注于内容而不是指针,你可以用
char_sequence替换字符串。
标签: c++