【问题标题】:Cannot run class with template from different .cpp file无法使用来自不同 .cpp 文件的模板运行类
【发布时间】:2020-09-24 08:22:16
【问题描述】:

我有一个使用模板的类,当我只使用一个 .cpp 文件编写它时,它工作正常,但是当我尝试将该类放入它自己的 .cpp 和 .hpp 文件时,我收到一条错误消息:preLaunchTask "C /C++: g++ build active file" 以退出代码 1 终止,但是当我点击“显示错误”时,它告诉我到目前为止在工作区中没有检测到任何问题。

当我尝试分离一个函数时它也有效,这意味着链接器设置正确

HelloWorld.hpp

#pragma once
#include <iostream>
void HelloWorld();

HelloWorld.cpp

#include "HelloWorld.hpp"

void HelloWorld()
{
    std::cout<< "Hello World"<< std::endl;
}

main.cpp

#include "HelloWorld.hpp"

int main()
{
    HelloWorld();
}

上面的 sn-p 只是一个伪代码,所以可能会有错误,但是当我正确运行它时它可以工作,但是当我尝试做一些更复杂的事情时,比如类定义它就不起作用了。

这是我的相关代码

myArray.hpp

# pragma once
# include<iostream>


#ifndef N_PLAN
    #define N_PLAN 2 // Planned length of the arrays
#endif

template<typename T, size_t S>
class myArray
{
public:

    int arraySize();

    T& operator[](size_t index);

    T* arrayData();
    const T* arrayData() const;

private:
    T m_Data[S];

myArray.cpp

#include"myArray.hpp"

template<typename T, size_t S>
class myArray
{
public:

    constexpr int arraySize() const {return S; }

    T& operator[](size_t index) {return m_Data[index]; }


    T* arrayData() { return m_Data; }
    const T* arrayData() const { return m_Data; }

private:
    T m_Data[S];

};

ma​​in.cpp

#include "myArray.hpp"

int main()
{
    myArray<int, N_PLAN> data;

    data[0] = 0;
    data[1] = 196996;

    for(size_t i = 0; i <data.arraySize(); i++)
    {
        std::cout<< data[i] <<std::endl;
    }
}

【问题讨论】:

标签: c++ class templates


【解决方案1】:

你的实现应该是这样的

前面有未经测试的代码

#include"myArray.hpp"

template<typename T, size_t S>
constexpr int myArray::arraySize() const {return S; }

template<typename T, size_t S>
T& myArray::operator[](size_t index) {return m_Data[index]; }

template<typename T, size_t S>
T* myArray::arrayData() { return m_Data; }

template<typename T, size_t S>
const T* myArray::arrayData() const { return m_Data; }

不幸的是,它仍然无法正常工作,因为它不会从 main 实例化,因为它看不到上述的实现。解决方案是将上述内容放入 myArrayImpl.hpp 文件中,并将其包含在 main.cpp 中,以便它可以看到实现而不仅仅是定义。

或者,您可以使用显式模板实例化并将以下内容添加到 myArray.cpp 文件中

template class myArray<int, N_PLAN>; // explicit instantiation

这会创建一个可供其他目标文件使用的实例化。但是你必须对每个不同的模板参数都这样做。

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2014-09-17
    相关资源
    最近更新 更多