Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动成员功能调试符号错误的解决方法?_C++_Gcc_C++11_Clang_C++14 - Fatal编程技术网

C++ 自动成员功能调试符号错误的解决方法?

C++ 自动成员功能调试符号错误的解决方法?,c++,gcc,c++11,clang,c++14,C++,Gcc,C++11,Clang,C++14,调试符号和自动设置似乎有问题 我在一个类中有一个自动函数: #include <cstddef> template <typename T> struct binary_expr { auto operator()(std::size_t i){ return 1; } }; int main(){ binary_expr<double> b; return 0; } 如果我删除-g或显式地设置类型,它就可

调试符号和自动设置似乎有问题

我在一个类中有一个自动函数:

#include <cstddef>

template <typename T>
struct binary_expr {
    auto operator()(std::size_t i){
        return 1;
    }
};

int main(){
    binary_expr<double> b;
    return 0;
}
如果我删除-g或显式地设置类型,它就可以完美地工作

clang++不应该是C++14功能完成的吗


有没有解决这些限制的办法,否则我就完蛋了

这现在似乎在Clang 3.5 SVN上有效。罪犯似乎是2013年5月犯下的罪行,请参见Clang邮件列表

PR16091:尝试发出未还原自动的调试信息时出错 返回类型

也许我们应该压制这一点,而不是犯错误,但是 我们有它的基础设施,我想我会使用它-如果这是真的 如果我们决定不做正确的事情,我们可能应该删除它 整个基础设施。我猜这是从早期就开始的 实现调试信息支持的方法


但是,我找不到删除此信息的提交,也许有一个改进,现在可以防止触发此行为。

即使过了一段时间,我找到的唯一解决方法是制作函数模板,这是一个相当愚蠢的解决方法。。。显然,clang对模板中的自动函数没有问题。我不知道这是否在每种情况下都有效,但直到现在它对我都有效

#include <cstddef>

template <typename T>
struct binary_expr {
    template<typename E = void>
    auto operator()(std::size_t i){
        return 1;
    }
};

int main(){
    binary_expr<double> b;
    return 0;
}
#包括
模板
结构二进制表达式{
模板
自动运算符()(标准::大小\u t i){
返回1;
}
};
int main(){
二进制表达式b;
返回0;
}

我假设您想从
操作符()返回
T
;如果是这种情况,那么我看不出有任何理由让编译器推断返回类型。为什么不显式地将
T
声明为返回类型?使用gcc 4.9编译。至于clang是功能完整的,发出调试信息不是语言功能。@Jeffrey这是一个简化的情况,在我想要的情况下,这不是一个T,但是如果不使用auto,推导可能会很复杂。实际上,不,它似乎仍然没有被修复。您的测试用例版本确实有效,同意,但删除了
b(0)
实例化,它再次被破坏:
clang++ -g -std=c++1y auto.cpp
error: debug information for auto is not yet supported
1 error generated.
// RUN: %clang_cc1 -emit-llvm-only -std=c++1y -g %s 2>&1 | FileCheck %s
2   
3   struct foo {
4     auto func(); // CHECK: error: debug information for auto is not yet supported
5   };
6   
7   foo f;
#include <cstddef>

template <typename T>
struct binary_expr {
    template<typename E = void>
    auto operator()(std::size_t i){
        return 1;
    }
};

int main(){
    binary_expr<double> b;
    return 0;
}