从模板实例化/类型推导中查找错误消息的实际源

时间:2017-07-03 21:09:31

标签: c++ visual-studio

我正在尝试构建的某些第三方库的模板化功能中出现错误。

MSVC指向该功能并告诉我,我正在为特定呼叫做错事。我怎么知道错误发生在哪个电话?

如果重要,这就是功能:

template <typename T>
std::string ToString(T number) {
    std::ostringstream ss;
    ss << std::setprecision(NUM_TO_STRING_PRECISION);
    ss << number;
    return ss.str();
}

错误是:

  

错误C2088'&lt;&lt;':类

非法

1 个答案:

答案 0 :(得分:1)

  

我怎么知道错误发生在哪个电话?

不是,但让我们看一个简单的example

#include <vector>

struct Foo {
    Foo() = delete;
};

int main() {
    std::vector<Foo> vfoo(15);
    (void)vfoo;
}

GCC g ++输出以下错误消息:

In file included from /usr/local/include/c++/7.1.0/vector:63:0,
                 from main.cpp:1:
/usr/local/include/c++/7.1.0/bits/stl_uninitialized.h: In instantiation of 'static _ForwardIterator std::__uninitialized_default_n_1<true>::__uninit_default_n(_ForwardIterator, _Size) [with _ForwardIterator = Foo*; _Size = long unsigned int]':
/usr/local/include/c++/7.1.0/bits/stl_uninitialized.h:583:20:   required from '_ForwardIterator std::__uninitialized_default_n(_ForwardIterator, _Size) [with _ForwardIterator = Foo*; _Size = long unsigned int]'
/usr/local/include/c++/7.1.0/bits/stl_uninitialized.h:645:44:   required from '_ForwardIterator std::__uninitialized_default_n_a(_ForwardIterator, _Size, std::allocator<_Tp>&) [with _ForwardIterator = Foo*; _Size = long unsigned int; _Tp = Foo]'
/usr/local/include/c++/7.1.0/bits/stl_vector.h:1347:36:   required from 'void std::vector<_Tp, _Alloc>::_M_default_initialize(std::vector<_Tp, _Alloc>::size_type) [with _Tp = Foo; _Alloc = std::allocator<Foo>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]'
/usr/local/include/c++/7.1.0/bits/stl_vector.h:285:30:   required from 'std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = Foo; _Alloc = std::allocator<Foo>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<Foo>]'
main.cpp:9:29:   required from here
/usr/local/include/c++/7.1.0/bits/stl_uninitialized.h:548:37: error: use of deleted function 'Foo::Foo()'
    return std::fill_n(__first, __n, _ValueType());
                                     ^~~~~~~~~~~~
main.cpp:4:5: note: declared here
     Foo() = delete;
     ^~~

IIRC它在视觉工作室非常相似。只需打开原始输出选项卡,然后转到最后一个note,其中可能包含错误的真实来源

使用rextester的MSVC结果。同样,source_file.cpp的最后一个注释指向了错误的真正来源。