错误 C2664:无法将参数 1 从 'X' 转换为 'X'
error C2664: cannot convert parameter 1 from 'X' to 'X'
我在Visual Studio 2008中有一个C++/Win32/MFC项目,在编译它时收到一条奇怪的错误消息。
我创建了一个小项目来演示这个问题,主要代码是
#ifndef _MyObject_h
#define _MyObject_h
class MyObject
{
public:
MyObject()
{
}
};
#endif // _MyObject_h
// --- END MyObject.h
// --- BEGIN ObjectData.h
#ifndef _ObjectData_h
#define _ObjectData_h
template <typename DataPolicy>
class ObjectData
{
public:
DataPolicy *data;
ObjectData() :
data(NULL)
{
}
ObjectData(const ObjectData<DataPolicy> ©) :
data(copy.data)
{
}
ObjectData<DataPolicy> & operator=(const ObjectData<DataPolicy> ©)
{
this->data = copy.data;
return *this;
}
};
#endif // _ObjectData_h
// --- END ObjectData.h
// --- BEGIN Tool.h
#ifndef _Tool_h
#define _Tool_h
#include "ObjectData.h"
template <typename ObjectPolicy>
class Tool
{
private:
ObjectData<typename ObjectPolicy> _object;
public:
Tool(ObjectData<typename ObjectPolicy> obj);
};
#endif // _Tool_h
// --- END Tool.h
// --- BEGIN Tool.cpp
#include "stdafx.h"
#include "Tool.h"
template <typename ObjectPolicy>
Tool<ObjectPolicy>::Tool(ObjectData<typename ObjectPolicy> obj) :
_object(obj)
{
}
// --- END Tool.cpp
// --- BEGIN Engine.h
#ifndef _Engine_h
#define _Engine_h
#include "Tool.h"
#include "MyObject.h"
class Engine
{
private:
MyObject *_obj;
public:
Engine();
~Engine();
void DoSomething();
};
#endif // _Engine_h
// --- END Engine.h
// --- BEGIN Engine.cpp
#include "stdafx.h"
#include "Engine.h"
Engine::Engine()
{
this->_obj = new MyObject();
}
Engine::~Engine()
{
delete this->_obj;
}
void Engine::DoSomething()
{
ObjectData<MyObject> objData;
objData.data = this->_obj;
// NEXT LINE IS WHERE THE ERROR OCCURS
Tool< ObjectData<MyObject> > *tool = new Tool< ObjectData<MyObject> >(objData);
}
// --- END Engine.cpp
错误:
引擎.cpp
c: \projects\myproject\myproject\engine.cpp(18):错误C2664:
"工具::工具(ObjectData)":无法将参数1从"ObjectData"转换为"ObjectData"
与
[
ObjectPolicy=ObjectData,
DataPolicy=对象数据
]
和
[
DataPolicy=MyObject
]
和
[
DataPolicy=对象数据
]
没有用户定义的可执行此转换的转换运算符,或者无法调用该运算符
1> 生成日志保存在"file://c:\Projects\MyProject\Debug\BuildLog.htm"
MyProject-1个错误,0个警告
谢谢你的帮助。
您的代码有一些问题。首先,您使用typename
关键字的方式不对。typename
只能在使用限定的类型名称时使用(当类型名称依赖时是必需的),但情况并非如此:
template <typename ObjectPolicy>
class Tool
{
private:
ObjectData<typename ObjectPolicy> _object; // "typename" is not needed!
public:
Tool(ObjectData<typename ObjectPolicy> obj); // "typename" is not needed!
};
然而,您抱怨的问题是Tool
类模板的实例化:
Tool< ObjectData<MyObject> > *tool = new Tool< ObjectData<MyObject> >(objData);
Tool<>
模板包含类型为ObjectData<ObjectPolicy>
的成员变量,其中ObjectPolicy
是类模板参数。但是,在上面的行中,您使用ObjectData<MyObject>
作为参数实例化Tool
。这意味着您的成员变量将具有类型ObjectData<ObjectData<MyObject>>
,并且这也是构造函数参数的类型。
因此,您正试图调用一个构造函数,该构造函数接受具有不匹配类型ObjectData<MyObject>
的参数的ObjectData<ObjectData<MyObject>>
。因此,你得到的错误。
您应该将实例化更改为:
Tool< MyObject > *tool = new Tool< MyObject >(objData);
另一个问题是在单独的.cpp
文件中定义了Tool
的成员函数。您不应该这样做:在处理单独的翻译单元时,链接器将无法看到它。
要解决这个问题,请将类模板的成员函数的定义放在定义类模板的同一个头中(在您的示例中为Tool.h
)。
Tool< ObjectData<MyObject> > *tool = new Tool< ObjectData<MyObject> >(objData);
template <typename ObjectPolicy>
Tool<ObjectPolicy>::Tool(ObjectData<typename ObjectPolicy> obj) :
_object(obj)
{
}
在我看来,你可能并不真正理解模板是如何工作的。查看以下C++模板您当前拥有的是无效的C++语法。看一看,再给它一次机会。
- C2664 无法从'initializer list'转换参数
- 了解错误 C2664:无法转换参数 1
- 错误 C2664:无法从'NvPhysicalGpuHandle'转换参数 1
- C2664: 显式强制转换运算符未按预期强制转换
- 错误 C2664:"errno_t wcstombs_s(size_t *,字符 *,size_t,常量 wchar_t *,size_t)":无法转换参数 4
- 错误C2664:无法转换参数错误
- 在集合中转换为小写 C++ 错误 C2664
- 错误 C2664:无法将参数 1 从 'int' 转换为 'int []'
- 错误 C2664:"发送":无法将参数 2 从"服务器问候语"转换为"常量字符 *"
- 错误C2664:无法转换参数(指纹传感器检测)
- 错误 C2664:'CComboBox::InsertString':无法将参数 2 从 'const char [4]' 转换为 'LPCTSTR'
- 错误 C2664:'VariantCopy':无法将参数 2 从 'const VARIANT *' 转换为 'VARIANTARG *'
- 错误 C2664:'cvSaveImage':无法将参数 2 从 'cv::Mat' 转换为 'const CvArr *'
- 错误 C2664:'auxDIBImageLoadW':无法将参数 1 从 'LPSTR' 转换为 'LPCWSTR'
- C++错误 C2664:无法将"mw::世界"转换为"mw::世界"
- 错误 C2664:无法将参数 1 从"int [][]"转换为"int",错误 C2087:缺少下标
- 可视C++:错误 C2664:'GetModuleFileNameW':无法将参数 2 从 'char [260]' 转换为'LPWCH'
- 错误 C2664:show_info:无法将参数 2 从 'char [20]' 转换为"字符"
- 错误 C2664:无法将'IDWriteFactory2 **'转换为'IUnknown **'
- vector迭代的派生和基之间的类型转换:C2664错误