C++ 未解决的外部错误

C++ 未解决的外部错误,c++,visual-studio-2010,C++,Visual Studio 2010,我写过这样的美丽: #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:

我写过这样的美丽:

#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>();
}
#包括
构造某物{
静态常量char ref[];
};
常量char something::ref[]=“”;
模板结构到文本{
私人:
静态到隐藏[N];
公众:
to_literal()
:ref(隐藏){
对于(int i=0;i
它在字符串文字类型之间进行了一些干净的转换。但是当我编译它时,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)
struct some{
friend int main();
私人:
静态wchar_t隐藏[40];
公众:
一些()
{    
}
};
int main(){

std::cout当我用VC 2008构建这个时,这不是我得到的错误。错误是:

错误1错误LNK2001:未解决 外部符号“专用:静态” wchar_t*到_literal::隐藏” (?隐藏?$to_literal@$00$1?ref@something@@2QBDB_W@@0PA_WA)main.obj启用码

静态
删除到隐藏[N];
成员解决了该问题


你确定错误消息正确吗?

当我用VC 2008构建此程序时,我没有收到错误。错误是:

错误1错误LNK2001:未解决 外部符号“专用:静态” wchar_t*到_literal::隐藏” (?隐藏?$to_literal@$00$1?ref@something@@2QBDB_W@@0PA_WA)main.obj启用码

静态
删除到隐藏[N];
成员解决了该问题


您确定错误消息正确吗?

您正在声明但未定义静态成员。添加类似于

template<int N, const char(&t_ref)[N], typename to>
to to_literal<N, t_ref, to>::hidden[N];

看起来当他们修复一个bug时,后面还有另一个bug;-/.

您正在声明但未定义静态成员。添加如下内容

template<int N, const char(&t_ref)[N], typename to>
to to_literal<N, t_ref, to>::hidden[N];

看起来,当他们修复一个bug时,后面会有另一个bug;-/.

当您定义静态成员时,声明是不够的..即添加

wchar_t some::hidden[40];
在类之外,它将被定义


否则,如果C++允许它在标题中定义一个全局变量,那么每个CPP文件都会有一个重复的定义,在链接的时候,会得到一个多重定义的符号错误。

< P>当你定义静态成员时,一个声明就不足够了。
wchar_t some::hidden[40];
在类之外,它将被定义


否则,如果C++允许,它会导致与在头中定义全局变量一样的问题——包括它的CPP文件将带有一个重复的定义,并且在链接时,您将得到一个多重定义的符号错误。

< P>问题是,<>代码> to>文字::隐藏被声明但从未定义。看:

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
已声明但从未定义。请再看一看:

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];
};


我仍在试图弄清楚const char(&ref)[N]
是什么意思。这段代码要么精彩,要么疯狂。这是对字符串文字的引用。“…这美”-这句格言的完美例子“美在旁观者的眼中”:)你的简化程序不是一个完整的、可编译的例子。@Alex:原谅我,我忘了包括iostream。我仍在试图弄清楚
const char(&ref)[N]
的意思。这段代码要么很精彩,要么很疯狂,它是对字符串文字的引用。“…这美”-这句格言“美在旁观者眼中”的完美例子:)您的简化程序不是一个完整的可编译的示例。@亚历克斯:原谅我,我忘了包含iostream。@OJ:我把错误消息说错了。我不能接受删除静态限定符。它只是一个静态数组,我不明白问题出在哪里。我想我说的不够清楚。删除静态限定符实际上定义了实例
hidden
成员的ce(这确实是我应该说的问题所在)。另一个选项是从外部定义它,这是Adam建议的。@OJ:我把错误消息的措辞弄错了。我不能接受删除静态限定符。它只是一个静态数组,我不明白问题是什么。我想我说的不够清楚。删除静态实际上定义了
隐藏的
memb的实例呃(这确实是我应该说的问题所在)。另一个选项是外部定义它,这是Adam建议的。我刚刚尝试过。显然,类模板参数列表格式错误(我记得在上添加了数组说明符)。那不行——你需要为你所说的特定模板实例化定义静态成员。记住,模板实际上并没有创建任何东西,它只定义了一种创建东西的方法。@Drew Hall:我为所有可能存在的实例化定义它,就像我在clas中定义了一个成员函数一样s、 除非我专门化了模板,否则我希望所有实例化都能实例化它。@DeadMG:我已经剪切并粘贴了您的代码,并在上面添加了代码(添加了数组dim-谢谢),将您的文字更改为某物,并输出结果-所有这些都适用于GCC 3.4.6。@Drew:模板在使用时会实例化。是的,我知道。我检查了MSDN页面上的此错误,但我肯定没有这样做。我只是尝试过。显然,类模板参数列表格式错误(我记得在上添加了数组说明符)。那不行——你需要为你所说的特定模板实例化定义静态成员。记住,模板实际上并没有创建任何东西,它只定义了一种创建东西的方法。@Drew Hall:我为所有可能存在的实例化定义它,就像我用