我写过这个美女:
#include <iostream>
struct something {
static const char ref[];
};
const char something::ref[] = "";
template<int N, const char(&t_ref)[N], typename to> struct to_literal {
private:
static to hidden[N];
public:
to_literal()
: ref(hidden) {
for(int i = 0; i < N; i++)
hidden[i] = t_ref[i];
}
const to(&ref)[N];
};
template<int N, const char(&ref)[N], typename to> const to* make_literal() {
return to_literal<N, ref, to>().ref;
}
int main() {
const wchar_t* lit = make_literal<sizeof(something::ref), something::ref, wchar_t>();
}
它在字符串文字类型之间有点干净地转换。但是当我编译它时,MSVC说make_literal函数是一个未定义的外部函数 - 这显然是不正确的,因为它在那里被定义。
编辑:我已经设法在没有所有模板垃圾的情况下减少了问题。
struct some {
friend int main();
private:
static wchar_t hidden[40];
public:
some()
{
}
};
int main() {
std::cout << some::hidden;
//const wchar_t* lit = make_literal<sizeof(something::ref), something::ref, wchar_t>();
}
main.obj : error LNK2001: unresolved external symbol "private: static wchar_t * some::hidden" (?hidden@some@@0PA_WA)
它只是一个静态数组。生活是否恨我?
答案 0 :(得分:2)
您正在声明但未定义静态成员。添加类似......
的内容template<int N, const char(&t_ref)[N], typename to>
to to_literal<N, t_ref, to>::hidden[N];
我也尝试为你检查MSVC,但是对于VS2005我又得到了另一个愚蠢的错误......
template<int N, const char(&t_ref)[N], typename to>
to to_literal<N, t_ref, to>::hidden[N];
...编译器抱怨...
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
看起来当他们修复一个错误时,背后还有另一个错误; - /。
答案 1 :(得分:2)
定义静态成员时,声明是不够的。 You must provide a definition outside the class。即添加
wchar_t some::hidden[40];
在课外,它将被定义。
否则,如果C ++允许这样做,它会导致与在头文件中定义全局变量相同的问题 - 包含它的每个.cpp文件都会有一个重复的定义,并且在链接时你会得到一个乘法定义的符号错误。
答案 2 :(得分:2)
问题在于to_literal::hidden
已声明但从未定义过。再看看:
struct something {
static const char ref[]; // declaration of something::ref
};
const char something::ref[] = ""; // definition of something::ref
template<int N, const char(&t_ref)[N], typename to> struct to_literal {
private:
static to hidden[N]; // declaration of to_literal::hidden (but there's no
// definition anywhere)
public:
to_literal()
: ref(hidden) {
for(int i = 0; i < N; i++)
hidden[i] = t_ref[i];
}
const to(&ref)[N];
};
要解决此问题,请添加to_literal::hidden
的正确定义:
template<int N, const char(&t_ref)[N], typename to>
to to_literal<N, t_ref, to>::hidden[N]; // definition of to_literal::hidden
答案 3 :(得分:1)
当我使用VC 2008构建它时,这不是我得到的错误。错误是:
错误1错误LNK2001:未解决 外部符号“私人:静态 wchar_t * to_literal&lt; 1,&amp; public:static char const * const 东西:: REF,wchar_t的&GT; ::隐藏” (?hidden @?$ to_literal @ $ 00 $ 1?ref @ something @@ 2QBDB_W @@ 0PA_WA)main.obj Enabler
从static
成员中删除to hidden[N];
解决了这个问题。
您确定错误消息是否正确?