相关疑难解决方法(0)

实现可变参数最小/最大功能

我正在实现可变的最小/最大函数.目标是利用编译时已知的参数数量并执行展开的评估(避免运行时循环).代码的当前状态如下(呈现min - max类似)

#include <iostream>  

using namespace std;

template<typename T>
T vmin(T val1, T val2)
{
    return val1 < val2 ? val1 : val2;
}

template<typename T, typename... Ts>
T vmin(T val1, T val2, Ts&&... vs)
{
    return val1 < val2 ?
        vmin(val1, std::forward<Ts>(vs)...) : 
            vmin(val2, std::forward<Ts>(vs)...);
}

int main()
{
    cout << vmin(3, 2, 1, 2, 5) << endl;    
    cout << vmin(3., 1.2, 1.3, 2., 5.2) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在这可行,但我有一些问题/问题:

  1. 该 …

c++ templates variadic-templates c++11

27
推荐指数
4
解决办法
5332
查看次数

致命错误LNK1179:文件无效或损坏:重复COMDAT'_IID_IXMLDOMImplementation'

当我链接项目时,我收到这个错误,

COMMUNICATION.obj:致命错误LNK1179:文件无效或损坏:重复COMDAT'_IID_IXMLDOMImplementation'

这个问题的根源是什么?

visual-studio-2005 visual-c++

13
推荐指数
2
解决办法
7092
查看次数

C ++模板化函数重载规则

重载模板化函数时,如果编译器可以选择以下任一选项,则编译器应如何选择要调用的版本:

  • 调用函数的模板版本(例如func<T>(foo))。
  • 调用该函数的重载版本,该重载版本本身不是模板化的,但是传递给该函数的参数的类型继承自重载函数模板中指定的类型。

考虑以下C ++代码:

#include <stdio.h>

struct Parent {}; 
struct Child : public Parent {}; 

template <typename T>
void func(T) {
  printf("func(T)\n");
}

void func(Parent) {
  printf("func(Parent)\n");
}

int main() {
  func(1);
  func(Parent());
  func(Child());
}
Run Code Online (Sandbox Code Playgroud)

用gcc或clang编译,输出:

func(T)
func(Parent)
func(T)
Run Code Online (Sandbox Code Playgroud)

前两行是预期的并且有意义。但是,在call中func(Child()),它可以像调用一样容易func(Parent)(这似乎(如果有的话)应该执行的操作)。

因此,我有两个主要问题:

  • 该标准针对如何解决此类冲突制定了确切的规则?这个问题/答案中有一些信息,但是如果有任何信息与我所观察到的相冲突。
  • 有什么方法可以强制编译器func(Parent)在传递a时调用Child

我可以在自己的代码中解决此要求,并且此示例是我尝试做的简化版本,但我认为这是相同的问题。

c++ templates overloading overload-resolution

5
推荐指数
1
解决办法
318
查看次数

如何检查传递给函数的容器是否已排序,如果没有则对其进行排序

我有一段时间以前写的这个功能:

template <class C, class T>
static inline bool findClosestObject( const C& container, const TimeUnit& now, T& object );
Run Code Online (Sandbox Code Playgroud)
  • C 是T元素的容器
  • TimeUnit 是一个封装日期和时间的类
  • T是一个有TimeUnit信息的对象

此函数std::lower_bound在容器中执行二进制搜索(使用)以查找最接近的对象now.

当我们进行二分查找时,必须对容器进行排序.该函数用于许多种容器(C可以是std::vector,std::set,std::map...)在很多地方.有时我们使用sorted std::vector而不是std::set因为它们的内存管理更快,也因为历史问题和与使用向量的其他代码的兼容性.

问题是我在代码中找到了一个地方,开发人员findClosestObject用一个没有排序的容器调用....好的bug ...而且我无法安全地识别出可以完成的所有地方.

所以我现在需要通过在这个特定的情况下对容器进行排序来防止它(它将会很慢但是至少会工作并且保证函数返回我们希望它返回的内容)

所以我试着修改我的功能:

template <class C, class T>
static inline const C& fixOrder( const C& container, C& temp )
{
    if ( std::is_sorted( container.begin(), container.end() )
    {
        return container;
    }
    else
    { …
Run Code Online (Sandbox Code Playgroud)

c++ sorting stl vector c++11

2
推荐指数
2
解决办法
109
查看次数