未解决的外部错误

时间:2010-11-24 00:55:01

标签: 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:
    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)

它只是一个静态数组。生活是否恨我?

4 个答案:

答案 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];解决了这个问题。

您确定错误消息是否正确?