当前位置: 首页 > 知识库问答 >
问题:

编译错误:未解析的重载函数类型

孔睿
2023-03-14

我尝试用g 4.7.2编译以下内容:

template <typename T>
struct A {
    struct B {
        T t;

        template<T B::*M>
        T get() {
            return this->*M;
        }
    };

    B b;

    T get() {
        return b.get<&B::t>();
    }
};


int main() {
    A<int> a;
    a.get();
}

它给了我

test.cpp: In member function ‘T A<T>::get()’:
test.cpp:15:23: error: expected primary-expression before ‘)’ token
test.cpp: In instantiation of ‘T A<T>::get() [with T = int]’:
test.cpp:22:8:   required from here
test.cpp:15:23: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int A<int>::B::*’ to binary ‘operator<’

为什么?

谢谢。

共有1个答案

能文华
2023-03-14

您需要使用模板消歧义符:

return b.template get<&B::t>();

如果没有它,在解析表达式时:

b.get<&B::t>();

编译器无法判断是否应该将< code>get解释为成员变量的名称后跟< code >

尽管我们知道表达式的寓意,但编译器不能,至少在实例化发生之前不能-并且即使您的函数从未实例化,也会执行语法解析。

 类似资料:
  • 编译器输出: 18:4:错误:重新定义'模板T随机::get(T, T)'12:4:注意:'模板T随机::get(T, T)'之前在这里声明在函数'int main()': 28:44:错误:没有匹配函数调用'get(浮动,浮动)'28:44:注意:候选是: 12:4:注意:模板T随机::get(T, T)12:4:注意:模板参数推导/替换失败: 这项工作很好: 还有这个: 为什么编译器无法在第一

  • 我希望有一个结构,它接受任意数量的lambdas,并作为所有调用操作符的中心调用点。 如果使用与构造时给出的任何 lambda 不匹配的参数列表调用调用运算符,则应调用默认调用运算符。 我以为下面的代码可以完全做到这一点。每个 lambda 的调用运算符都通过使用“提升”到 类。 当我在结构中没有默认的call操作符时,一切都像预期的那样工作(使用有效的参数列表)。如果我将它添加到结构中(如上面的

  • 问题演示 我的任务是创建一个动态Web项目,该项目扫描来自服务器的文档,通过我的程序并将图片从文本中拆分。我需要OpenCV库。我的代码在eclipse中运行良好,工作良好。现在,我需要将库作为全局模块加载到jboss中,而不是在eclipse中,以便服务器始终知道需要加载哪些库。我所做的一切都是这个链接描述的: 有人知道为什么这是个问题吗?是否存在验证问题?Eclipse在将一个新类放入open

  • 我有一个应用程序,它使用Maven构建一个带有Maven汇编插件的JAR。 该项目包括一个依赖项列表,其中一个是另一个Maven项目。我正在使用Eclipse开发,当我运行该项目时,一切都正常。当我使用Maven目标构建时,它会生成JAR,但当我运行JAR时,它会给我这个错误: 这是pom。主项目的xml文件: 这是my utils项目依赖项的pom: 这个问题与Java邮件依赖性有关。如你所见,

  • 我有osgi项目。每个包都是一个单独的maven项目。项目足够大,包括大约10个包。一切正常,一切正常。 在org.apache.maven.plugin.abstractCompilerMojo.execute(abstractCompilerMojo.java:656)在org.apache.maven.plugin.compilerMojo.execute(compilerMojo.java

  • 我的代码: external.js: 不幸的是,当我包含外部脚本时,出现以下错误: 错误:$不是一个函数 我该怎么解决这个问题?请记住,我不能编辑外部Javascript文件,因为它是第三方的。