代码之家  ›  专栏  ›  技术社区  ›  Puppy

未解决的外部错误

  •  1
  • Puppy  · 技术社区  · 14 年前

    我写过这样的美丽:

    #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 回复  |  直到 14 年前
        1
  •  2
  •   Adam Rosenfield    14 年前

    问题是 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::隐藏 :

    template<int N, const char(&t_ref)[N], typename to>
    to to_literal<N, t_ref, to>::hidden[N];  // definition of to_literal::hidden
    
        2
  •  2
  •   Alex Budovski    14 年前

    当您定义静态成员时,声明是不够的。 You must provide a definition outside the class . 即添加

    wchar_t some::hidden[40];
    

    在类之外,它将被定义。

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

        3
  •  2
  •   Tony Delroy    14 年前

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

    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
    

    看起来当他们修复一个错误时,后面还有一个;-/。

        4
  •  1
  •   OJ.    14 年前

    当我用VC 2008做这个的时候,那不是我犯的错误。错误是:

    错误1错误LNK2001:未解决 外部符号“私有:静态 wchar_t*to_literal<1,&public:静态 字符常量*常量 某物::ref,wchar t>::隐藏” (?隐藏@?$to_literal@$00$1?ref@something@@2QBDB\u W@@0PA\u WA)main.obj启用码

    移除 static to hidden[N]; 成员解决了问题。

    您确定错误信息正确吗?