小编use*_*911的帖子

为什么隐式转换在累积中不起作用?

这是C++程序:

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int test_string(const string & str) {
    return str.size();
}

void main() {
    test_string("");                                     //can compile
    vector<string> v;
    string sum = accumulate(v.cbegin(), v.cend(), "");   //cannot compile
}
Run Code Online (Sandbox Code Playgroud)

我想使用隐式转换,从const char *string仿制STL函数的调用accumulate.我知道转换const char *为字符串不是显式的,因此我们可以将const char *参数传递给需要string类型的调用.这可以通过上述test_string功能证明.但当我做同样的事情时accumulate,编译器抱怨:

error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'
Run Code Online (Sandbox Code Playgroud)

代码工作只有当我更换""使用string("").我不明白为什么隐式转换适用于我的自定义函数但不起作用accumulate.你能解释一下吗?非常感谢.

PS:我正在使用Visual Studio 2015.

c++ string templates implicit-conversion

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

DLL + 导出类 + 模板成员 func = 未解析的外部符号。有机会修复吗?

首先,这不是一个重复的问题,因为1)这是一个链接器问题,编译器成功通过,因为我已经显式实例化了。2)这不是关于模板类,而是模板成员函数,3)我对代码结构有一些限制,所以一些现有的技巧不适用。我在这里搜索了我的标题,前几个线程(4083239120330521253206191284887636940394)都是关于模板类,而不是模板成员函数。其他一些线程实际上正在谈论实例化失败,因此实际上是编译器问题,但我已经尝试过显式实例化并且编译已成功通过,重复一下。所以我希望你能抑制住把我的问题作为重复问题来结束的诱惑,这是我的帖子。

环境:

  • Windows 10 版本 1803
  • Visual Studio 2015 更新 3
  • 在VS中调试x64模式

来源:

有两个项目:

1) DllProject,构建为 dll,包含两个源:Dll.h 和 Dll.cpp。

DLL.h:

#pragma once

#ifdef _WINDLL
#define API_TYPE __declspec(dllexport)
#else
#define API_TYPE __declspec(dllimport)
#endif

class API_TYPE AClass {
public:
    template <class T> void Func(T& data);
    template <class T> void CallFunc(T& data) {
        Func<T>(data);
    }
};
Run Code Online (Sandbox Code Playgroud)

DLL.cpp:

#include "Dll.h"

template <class T> void AClass::Func(T& data) {
    data++;
}

template void AClass::Func<float>(float&);  //attempt to …
Run Code Online (Sandbox Code Playgroud)

c++ dll member-functions dynamic-linking template-function

6
推荐指数
1
解决办法
1440
查看次数

如何构建libjpeg 9b的DLL版本?

我想构建libjpeg 9b的DLL版本.根据这里的文档, 除了将配置类型设置为"动态库(.dll)"之外,似乎我们需要添加预处理器__declspec(dllexport)__declspec(dllimport)在声明要导出的每个函数之前.但这不是一件容易的事,因为libjpeg中有很多功能.那么,是否有任何捷径或解决方法来构建DLL libjpeg没有或几乎没有修改jpeglib.h?是否有任何DLL-ready libjpeg 9b可用?我在Windows 7 64bit上使用Visual Studio 2015.感谢您的回答.

PS:我从http://www.ijg.org/files/下载了libjpeg 9b的源代码.这是官方的下载地点吗?我问,因为.vcxproj(最初.v10)文件的起始字节似乎无效(C2 8B C2 AF C2 A8),因此Visual Studio无法打开它.

dll dllimport libjpeg dllexport visual-studio-2015

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

std :: gcd无法在g ++ 5.4.0中编译-'gcd'不是'std'的成员

环境:

  • Ubuntu 16.04 64位
  • g ++版本5.4.0

这是代码:

#include <numeric>
...
auto g = std::gcd(10, 4);
...
Run Code Online (Sandbox Code Playgroud)

我已经打开-std=c++17了编译命令中的选项:

g++ -m64 -std=c++17   -c -g -w -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误:

错误:“ gcd”不是“ std”的成员

从此网页开始std::gcd自C ++ 17开始引入。

此网页上,我的g ++版本支持C ++ 17。

但是为什么仍然存在错误?相同的代码可以在Visual Studio 2017中编译而不会出现任何错误。

c++ g++ std greatest-common-divisor c++17

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

C ++错误:专门定义模板类的成员函数的多个定义,但实际上我只定义了一次

问题来自计算机图形C ++项目,我想在其中计算比例场和3D矢量场的梯度。我们知道它们的梯度不同:比例场具有3D矢量梯度,而3D向量场具有3x3矩阵梯度。由于所有其他代码都相同,因此我正在使用模板来重用代码。但是我在专门化成员函数时遇到了一个问题,该成员函数具有用于计算不同数据类型的梯度的不同代码。最小化的代码如下:

//======== Main.cpp ======== 
#include "Render.h"
int main() {}

//======== Render.cpp ======== 
#include "Render.h"

//======== Render.h ======== 
#ifndef __RENDER_H__
#define __RENDER_H__
#include "VolumeGrid.h"
#endif

//======== VolumeGrid.h ======== 
#ifndef __VOLUMEGRID_H__
#define __VOLUMEGRID_H__

#include "Volume.h"

template < typename U >
class _Grid {
public:
    const typename GradType<U>::GType grad(const Vector& x) const;
    U * values = nullptr;
};

template <>
const Vector _Grid<float>::grad(const Vector& x) const {
    return Vector();
}

template <>
const Matrix _Grid<Vector>::grad(const Vector& x) const {
    return Matrix();
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates function specialization

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

Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)

我尝试按照此处的说明使用 Boost.Python。源代码位于该网页中。我可以编译、链接这个简单的示例代码,但无法在 python 命令行中导入生成的模块。总是报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named hello_ext
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题,因为该页面只是说:“就是这样。我们完成了。我们现在可以将其构建为共享库。生成的 DLL 现在对 Python 可见。” 这是我的构建环境:

  • Windows 7 64位,我是管理员并以管理员身份运行cmd
  • boost版本是1.64.0(预编译的二进制boost_1_64_0-msvc-14.0-64.exe从这里下载)
  • python版本是2.7.13,64位
  • Visual Studio 2015,更新 3
  • 目标是一个DLL
  • 项目名称为 ConsoleApplication1,因此输出为 ConsoleApplication1.dll。我已将文件名更改为 hello_ext.dll 但出现同样的错误。
  • 我使用 x64 配置构建,并使用 dumpbin 验证输出 ConsoleApplication1.dll 确实是 64 位
  • 我已将包含 ConsoleApplication1.dll 的路径 ......\ConsoleApplication1\x64\Release 添加到 python 命令行内的 sys.path 中。

那么,你能告诉我如何在 python 中导入模块吗?多谢。

c++ python dll boost python-import

0
推荐指数
1
解决办法
2673
查看次数