depending on a template parameter"?-6ren"> depending on a template parameter"?-我正在将我的遗留 VC++ 项目转换为与 Android NDK 兼容,但我遇到了一个奇怪的错误。消息说: [armeabi] Compile++ thumb: procalc-core std::-6ren">
gpt4 book ai didi

android - 如何解决 "There are no arguments to depending on a template parameter"?

转载 作者:行者123 更新时间:2023-11-28 07:16:19 28 4
gpt4 key购买 nike

我正在将我的遗留 VC++ 项目转换为与 Android NDK 兼容,但我遇到了一个奇怪的错误。消息说:

[armeabi] Compile++ thumb: procalc-core <= pcc_arithmetics.cpp
In file included from D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_arithmetics.h:10:0,
from D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_arithmetics.cpp:1:
D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_common.h: In static member function
'static std::string ProCalcCore::CommonTools::ToStringBase(T, int)':

D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_common.h:102:68: error: there are no
arguments to 'ConvertException' that depend on a template parameter, so a
declaration of 'ConvertException' must be available [-fpermissive]

throw ConvertException(PROCALC_ERROR_SYNTAX_INVALID_INTEGER_BASE);
^
D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_common.h:102:68: note: (if you use
'-fpermissive', G++ will accept your code, but allowing the use of an undeclared
name is deprecated)

make.exe: *** [D:/Dokumenty/Dev/Android/ProCalc//obj/local/armeabi/objs/procalc-
core/pcc_arithmetics.o] Error 1

错误在以下地方抛出:

template <typename T>
std::string CommonTools::ToStringBase(T val, int base)
{
if (base < 2)
throw ConvertException(PROCALC_ERROR_SYNTAX_INVALID_INTEGER_BASE);

大写命名的错误值是一个#defined int 值。

ConvertException 在另一个文件中声明:

namespace ProCalcCore
{
(...)
class ConvertException : public InternalException
{
public:
ConvertException(const unsigned long int & newErrorCode);
};

当我尝试将 ConvertException 更改为 ProCalcCore::ConvertException 时,出现另一个错误:

D:/Dokumenty/Dev/Android/ProCalc//jni/pcc_common.h:102:10: error: 'ConvertException' 
is not a member of 'ProCalcCore'

所有依赖项都已正确解析 - 在 VS 中项目编译没有问题。

我该如何解决?是什么导致了这个错误?

最佳答案

“在 visual studio 中项目编译没有问题”是你的依赖关系正确的微弱证据。

问题是 ConvertException 在声明 template 的地方不可见。某些版本的 Visual Studio 仅尝试在实例化 template 时绑定(bind)此类“自由”类型和表达式,这在 C++ 标准下是不正确的。

因此您的编译器指出它无法计算出 ConvertException 指的是什么类型。为了让它知道它指的是什么类型,您需要前向声明它(这可能有其自身的问题),或者在使用它之前 #include 头文件。

如果您认为您已经在 #include 了,通常您的问题是包含 ConvertException 的头文件以 #include 结束正在调用 CommonTools::ToStringBase。头文件保护(或 #pragma once)然后消除无限循环。

烦人的是,如何消除无限循环取决于你先包含哪个头文件!如果包含 ConvertException 头文件,则它会包含 ToStringBase,后者包含 ConvertException。第二个 #include "ConvertException.h" 被头文件 #define 守卫消除了。

如果您改为首先包含 ToStringBase,它将包含 ConvertException,然后包含 ToStringBase,后者被 header 保护消除。

因此,无论首先包含什么头文件,其次都会被解析。

关于android - 如何解决 "There are no arguments to <name> depending on a template parameter"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202157/

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