这是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,编译器抱怨:
Run Code Online (Sandbox Code Playgroud)error C2440: '=': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'const char *'
代码工作只有当我更换""使用string("").我不明白为什么隐式转换适用于我的自定义函数但不起作用accumulate.你能解释一下吗?非常感谢.
PS:我正在使用Visual Studio 2015.
首先,这不是一个重复的问题,因为1)这是一个链接器问题,编译器成功通过,因为我已经显式实例化了。2)这不是关于模板类,而是模板成员函数,3)我对代码结构有一些限制,所以一些现有的技巧不适用。我在这里搜索了我的标题,前几个线程(40832391、20330521、25320619、12848876、36940394)都是关于模板类,而不是模板成员函数。其他一些线程实际上正在谈论实例化失败,因此实际上是编译器问题,但我已经尝试过显式实例化并且编译已成功通过,重复一下。所以我希望你能抑制住把我的问题作为重复问题来结束的诱惑,这是我的帖子。
环境:
来源:
有两个项目:
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) 我想构建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无法打开它.
环境:
这是代码:
#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 ++项目,我想在其中计算比例场和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) 我尝试按照此处的说明使用 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 可见。” 这是我的构建环境:
那么,你能告诉我如何在 python 中导入模块吗?多谢。