C ++,数组声明,模板,链接器错误

时间:2012-11-04 22:50:44

标签: c++ templates linker-errors

我的SW中存在链接器错误。我正在使用基于h,hpp,cpp文件的以下结构。有些类是模板化的,有些不是,有些是函数模板。 SW包含数百个包含的类......

声明:

test.h
#ifndef TEST_H
#define TEST_H

class Test
{
   public: 
        template <typename T>
        void foo1();

        void foo2 ();
};

#include "test.hpp" 

#endif

定义:

test.hpp
#ifndef TEST_HPP
#define TEST_HPP

template <typename T>
void Test::foo1() {}

inline void Test::foo2() {} //or in cpp file

#endif

CPP文件:

test.cpp
#include "test.h"

void Test::foo2() {} //or in hpp file as inline

我有以下问题。变量vars []在我的h文件中声明

test.h
#ifndef TEST_H
#define TEST_H

char *vars[] = { "first", "second"...};

class Test
{
    public: void foo();
};

#include "test.hpp"

#endif

并用作hpp文件中定义为内联的foo()方法内的局部变量。

test.hpp
#ifndef TEST_HPP
#define TEST_HPP


inline void Test::foo() {
    char *var = vars[0];   //A Linker Error
}

#endif

但是,会发生以下链接器错误:

Error   745 error LNK2005: "char * * vars" (?vars@@3PAPADA) already defined in main.obj

如何以及在何处声明vars []以避免链接器错误?包括

之后
#include "test.hpp"

宣布它已经晚了......

正如我所写,该软件包含很多cpp,并且hpp文件互相包含(所有包含都已经过检查)。发送整个例子是不可能的......

main.obj表示包含主类的文件。

3 个答案:

答案 0 :(得分:3)

使用extern链接

在标头中声明vars
extern const char* vars[];

并在一个源文件中定义

const char* vars[] = {"foo", "bar"};

请注意const,不推荐将字符串文字转换为char*。您现在拥有它的方式,违反了One definition rule(您在标题所包含的每个翻译单元中重新定义vars)。

答案 1 :(得分:2)

我认为你只需要在test.hpp

中使用它
extern char *vars[];

...这在test.cpp

char *vars[] = { "first", "second"...};

答案 2 :(得分:0)

我假设您没有声明两个名为Test的类。如果你是,这将导致你没有问题的结束。你不被允许这样做。

所以我假设class Test的完整声明如下:

class Test
{
 public:
   void foo();

   template <typename T>
   void foo1();

   void foo2 ();
};

如果是这种情况,那么你的问题很明显。

您需要更改vars的定义。您需要在test.h

中拥有此功能
extern char *vars[];

这是test.cpp

char *vars[] = { "first", "second"...};

否则编译器会认为您正在尝试在每个文件中声明新版本的vars