-3

所以我试图对存储在向量中的卡片向量进行排序。

向量是std::vector<CUE>CUE 是一个代表“正在评估的卡片”的类,而里面的卡片是const Card*. 我需要的是使用我创建的名为compareCards.

但是,我生成以下错误:

错误 C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : 无法推断出 'const std::basic_string<_Elem,_Traits,_Alloc> 的模板参数&'来自'提示'

函数声明位于另一个名为 的文件Table.h中,排序调用位于Table.cpp. 这整件事都是为了我正在创建的扑克游戏,但是对牌进行排序产生了一个错误,让我停了下来。

如何在成功排序手的同时摆脱此错误?

以下是相关代码:

排序调用:

表.cpp

std::sort(cardvec.begin(), cardvec.end(), compareCards);

函数声明:

表.h

bool compareCards(const Card* c1, const Card* c2)
{   
    return c1->GetPip() < c2->GetPip(); 
}

提示.h

#pragma once
#include <vector>
#include <iostream>
#include "card.h"

struct CUE
{
    CUE(void);
    ~CUE(void);
    CUE(const std::vector<const Card*>& c) : _cue(c){}
    std::vector<const Card*> _cue;
};
4

2 回答 2

1

这是您提供的代码风格的工作示例(C++98):

#include <algorithm>
#include <iostream>
#include <vector>

struct X {
  int n;
  X(int v) : n(v) {}
};

bool compare(const X* a, const X* b) {
  return a->n < b->n; }

int main() {
  std::vector<const X*> v;
  v.push_back(new X(5));
  v.push_back(new X(4));
  v.push_back(new X(6));

  for (int i = 0; i < v.size(); ++i) {
    std::cout << v[i]->n << " ";
  }
  std::cout << "\n";

  std::sort(v.begin(), v.end(), compare);

  for (int i = 0; i < v.size(); ++i) {
    std::cout << v[i]->n << " ";
  }
  std::cout << "\n";
}

输出

5 4 6
4 5 6
于 2013-10-02T12:32:51.463 回答
0

作为亚当的答案的替代方案,这是一个使用更现代风格的类似解决方案(值而不是指针、初始化列表、比较器的 lambda、基于范围的循环等)

你可以看到它在这里运行:http: //coliru.stacked-crooked.com/a/96a4385814c7a4e5

#include <algorithm>
#include <iostream>
#include <vector>

struct X {
  int n;
  X(int v) : n(v) {}
};

void print(const std::vector<X>& container) {
    for (const auto& value : container) {
        std::cout << value.n << " ";
    }
    std::cout << "\n";
}

int main() {      
  std::vector<X> v{5, 4, 6};
  print(v);
  std::sort(v.begin(), v.end(), [](const X& a, const X& b){ return a.n < b.n; });
  print(v);
}
于 2013-10-02T12:43:06.870 回答