【问题标题】:Why does the order of template parameters matter to the MS C++ compiler in this example?为什么模板参数的顺序对本示例中的 MS C++ 编译器很重要?
【发布时间】:2014-11-21 12:16:58
【问题描述】:

以下代码在 GCC 中编译良好,但在 Visual Studio 中会导致

错误 C2782: 'bool contains(const T &,const std::initializer_list<T2> &)' : 模板参数 'T' 不明确,参见声明 “contains”可以是“const wchar_t *”或“std::wstring

但是,如果模板参数的顺序为

,它确实可以编译和工作

template<typename T2, typename T>

这是编译器错误吗?

#include <string>
#include <iostream>
#include <set>
#include <initializer_list>
#include <algorithm>

template<typename T, typename T2>
bool contains(T const& value, std::initializer_list<T2> const& set)
{
  return std::find(std::begin(set), std::end(set), value) != std::end(set);
}

int main(void)
{
  std::set<std::wstring> values = { L"bar", L"not" };

  for (std::wstring val : values) {
    std::wcout << "\"" << val << "\" ";
    if (contains(val, { L"foo", L"bar", L"baz", L"doom" })) {
      std::wcout << "found" << std::endl;
    }
    else {
      std::wcout << "not found" << std::endl;
    }
  }
}

编辑:我创建了一个错误报告:https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters

【问题讨论】:

  • 哎呀,我不参加这个...
  • 毫无意义......即这是一个错误:)
  • FWIW 如果您明确指定传递为std::initializer_list&lt;std::wstring&gt;{ ... } 的第二个参数,此编译。
  • 这里改变模板参数的顺序相当于改变函数形式参数的顺序,加上调用中实际参数的顺序。没关系。因此这是一个错误。您可以通过 (connect.microsoft.com/visualstudio) 举报。
  • @Cheersandhth.-Alf 你确定吗?由于 T 和 T2 的使用方式不同,我发现这违反直觉,但我可能不知道您使用的“形式参数”的定义。

标签: c++ templates visual-c++ c++11


【解决方案1】:

我记得 VS 有一个错误,他们会在某些情况下进行双重扣除,我认为这就是这里发生的情况。 Clang 也是双向编译的,所以由于 clang + gcc 同意,这很可能是一个 VS 错误。

【讨论】:

    【解决方案2】:

    我有一个类似的问题,通过切换到最新的 VS Pro 版本得到了解决。我认为这个错误已在最新的 VS 专业版中得到解决,因为我记得在某个时候在更改日志中看到过它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2020-11-22
      • 2022-01-06
      相关资源
      最近更新 更多