gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:24:44 25 4
gpt4 key购买 nike

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

声明:

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 表示包含主类的文件。

最佳答案

在带有外部链接的 header 中声明vars

extern const char* vars[];

并在同一个源文件中定义

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

注意 const,从字符串文字到 char* 的转换已弃用。你现在的方式,你违反了 One definition rule (您要在包含 header 的每个翻译单元中重新定义 vars)。

关于C++、数组声明、模板、链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13223782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com