gpt4 book ai didi

C++ : Using constexpr to alias template parameters, 导致函数定义与声明不匹配

转载 作者:行者123 更新时间:2023-11-28 05:54:17 25 4
gpt4 key购买 nike

我正在尝试基于预编译器变量获得类似于模板转发的东西。但是,我遇到了奇怪的编译错误,所以我将尝试举例说明我正在处理的内容。

我有一个采用两个模板参数的矩阵类,它使用模板参数的方式基于预编译器变量,该变量确定我们是处于列优先环境还是行优先环境。

template<size_t vectorLength>
class Vector {
//... Implementation stuff
}

#define ROW_MAJOR

template<size_t rows, size_t columns>
class Matrix {

#if defined(ROW_MAJOR)
std::array<Vector<columns>, rows> m_vectorArray;
#else
std::array<Vector<rows>, columns> m_vectorArray;
#endif

//... Other stuff
}

正如您可能想象的那样,这会导致我的代码中到处都是大量的 #if#else 预编译器语句,所以我没有这样做,而是想过在一个地方“转发”模板参数,并引用那些模板参数。例如……

#define ROW_MAJOR

template<size_t rows, size_t columns>
class Matrix {

#if defined(ROW_MAJOR)
static constexpr size_t numberOfVectors = rows;
static constexpr size_t vectorLength = columns;
#else
static constexpr size_t numberOfVectors = columns;
static constexpr size_t vectorLength = rows;
#endif

std::array<Vector<vectorLength>, numberOfVectors> m_vectorArray
//... Other stuff
}

这非常有效,直到我不得不返回单个 vector 。我试图在 Matrix 中这样声明一个函数:

template<size_t rows, size_t columns>
class Matrix {

//...Insert stuff from above
Vector<Matrix::vectorLength> GetVector(size_t index) const;
// ... Other stuff
}

在包含文件中,函数定义如下:

template<size_t rows, size_t columns>
Vector<Matrix<rows, columns>::vectorLength> Matrix<rows, columns>::GetVector(size_t index) const
{
//... Implementation
}

当我去编译它时,出现了以下错误

error C2244: 'Matrix::GetVector': unable to match function definition to an existing declaration

当 Visual Studio 报告此错误时,它会继续尝试通过打印函数 GetVector 的定义签名和所有声明签名来帮助我。

note: definition
note: 'Vector<Matrix<rows,columns>::vectorLength> Matrix<rows,columns>::GetVector(size_t index)'
note: existing declarations
note: 'Vector<Matrix<rows,columns>::vectorLength> Matrix<rows,columns>::GetVector(size_t index)'

这两个字符匹配字符(我知道这是一个例子,但我已经复制并粘贴了我在实际代码中得到的两个注释,比较它们,并且它们匹配字符字符),所以我想我的问题是……这是对 constexpr 的误用吗?有什么我忘记写的吗?这是 Visual Studio 编译器中的错误吗(我已经遇到了很多处理 constexpr 的 VS 错误)。还是这种做法很愚蠢?

一些注意事项:我尝试将定义放在头文件中,一切都编译正常。这不是“不要将模板定义放在 cpp 文件中”的问题,头文件和包含文件被捆绑到同一个包含包中,因此定义保证与类定义一起存在。

最佳答案

可能是 this MSVC bug 的另一种表现形式,虽然它有一个嵌套类型,而在这里你只是使用一个成员常量。

使用尾随返回类型来解决 - 它也更短:

auto Matrix<rows, columns>::GetVector(size_t index) const
-> Vector<Matrix::vectorLength> {
//...
}

此外,如果您在两个地方都这样做,您可以只写 vectorLength 而不是 Matrix::vectorLength

关于C++ : Using constexpr to alias template parameters, 导致函数定义与声明不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34553950/

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