0
我目前正在学习如何使用OpenCL进行编码,并决定运行一些示例代码。我已下载英特尔SDK,Microsoft Visual Studio 2017及其相关插件。Microsoft Visual Studio上的OpenCL:模板不能声明为具有C链接
当我尝试运行某个程序时,出现了与从Intel下载的%iNTELOCLSDKROOT依赖项中包含的其中一个“附加依赖性”文件有关的问题。我尝试构建解决方案时遇到的错误是模板不能声明为具有C链接(C2894)。这个错误完全位于一个名为xtr1common的文件中。我尝试将文件名从host.cpp更改为host.c,它删除了C2894错误,但随后出现语法错误,因为它明显不是C写的。如何解决?我很困惑,因为我非常怀疑英特尔在他们的代码中存在错误,以及我最不可能注意到的其他事情。为防万一代码中可能存在错误,我将它包含在下面。欢迎任何建议。
// xtr1common internal header
#pragma once
#ifndef _XTR1COMMON_
#define _XTR1COMMON_
#ifndef RC_INVOKED
#include <yvals.h>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,_STL_WARNING_LEVEL)
#pragma warning(disable: _STL_DISABLED_WARNINGS)
#pragma push_macro("new")
#undef new
_STD_BEGIN
// STRUCT _Nil
struct _Nil
{ // empty struct, for unused argument types
};
// TEMPLATE CLASS integral_constant
template<class _Ty,
_Ty _Val>
struct integral_constant
{ // convenient template for integral constant types
static constexpr _Ty value = _Val;
using value_type = _Ty;
using type = integral_constant;
constexpr operator value_type() const _NOEXCEPT
{ // return stored value
return (value);
}
constexpr value_type operator()() const _NOEXCEPT
{ // return stored value
return (value);
}
};
// ALIAS TEMPLATE bool_constant
template<bool _Val>
using bool_constant = integral_constant<bool, _Val>;
using true_type = bool_constant<true>;
using false_type = bool_constant<false>;
// TEMPLATE CLASS enable_if
template<bool _Test,
class _Ty = void>
struct enable_if
{ // type is undefined for assumed !_Test
};
template<class _Ty>
struct enable_if<true, _Ty>
{ // type is _Ty for _Test
using type = _Ty;
};
template<bool _Test,
class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;
// TEMPLATE CLASS conditional
template<bool _Test,
class _Ty1,
class _Ty2>
struct conditional
{ // type is _Ty2 for assumed !_Test
using type = _Ty2;
};
template<class _Ty1,
class _Ty2>
struct conditional<true, _Ty1, _Ty2>
{ // type is _Ty1 for _Test
using type = _Ty1;
};
template<bool _Test,
class _Ty1,
class _Ty2>
using conditional_t = typename conditional<_Test, _Ty1, _Ty2>::type;
// TEMPLATE CLASS is_same
template<class _Ty1,
class _Ty2>
struct is_same
: false_type
{ // determine whether _Ty1 and _Ty2 are the same type
};
template<class _Ty1>
struct is_same<_Ty1, _Ty1>
: true_type
{ // determine whether _Ty1 and _Ty2 are the same type
};
template<class _Ty,
class _Uty>
constexpr bool is_same_v = is_same<_Ty, _Uty>::value;
// TEMPLATE CLASS remove_const
template<class _Ty>
struct remove_const
{ // remove top level const qualifier
using type = _Ty;
};
template<class _Ty>
struct remove_const<const _Ty>
{ // remove top level const qualifier
using type = _Ty;
};
template<class _Ty>
using remove_const_t = typename remove_const<_Ty>::type;
// TEMPLATE CLASS remove_volatile
template<class _Ty>
struct remove_volatile
{ // remove top level volatile qualifier
using type = _Ty;
};
template<class _Ty>
struct remove_volatile<volatile _Ty>
{ // remove top level volatile qualifier
using type = _Ty;
};
template<class _Ty>
using remove_volatile_t = typename remove_volatile<_Ty>::type;
// TEMPLATE CLASS remove_cv
template<class _Ty>
struct remove_cv
{ // remove top level const and volatile qualifiers
using type = _Ty;
};
template<class _Ty>
struct remove_cv<const _Ty>
{ // remove top level const and volatile qualifiers
using type = _Ty;
};
template<class _Ty>
struct remove_cv<volatile _Ty>
{ // remove top level const and volatile qualifiers
using type = _Ty;
};
template<class _Ty>
struct remove_cv<const volatile _Ty>
{ // remove top level const and volatile qualifiers
using type = _Ty;
};
template<class _Ty>
using remove_cv_t = typename remove_cv<_Ty>::type;
// TEMPLATE CLASS _Is_integral
template<class _Ty>
struct _Is_integral
: false_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<bool>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<char>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<unsigned char>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<signed char>
: true_type
{ // determine whether _Ty is integral
};
#ifdef _NATIVE_WCHAR_T_DEFINED
template<>
struct _Is_integral<wchar_t>
: true_type
{ // determine whether _Ty is integral
};
#endif /* _NATIVE_WCHAR_T_DEFINED */
template<>
struct _Is_integral<char16_t>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<char32_t>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<unsigned short>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<short>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<unsigned int>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<int>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<unsigned long>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<long>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<unsigned long long>
: true_type
{ // determine whether _Ty is integral
};
template<>
struct _Is_integral<long long>
: true_type
{ // determine whether _Ty is integral
};
// TEMPLATE CLASS is_integral
template<class _Ty>
struct is_integral
: _Is_integral<remove_cv_t<_Ty>>::type
{ // determine whether _Ty is integral
};
template<class _Ty>
constexpr bool is_integral_v = is_integral<_Ty>::value;
// TEMPLATE CLASS _Is_floating_point
template<class _Ty>
struct _Is_floating_point
: false_type
{ // determine whether _Ty is floating point
};
template<>
struct _Is_floating_point<float>
: true_type
{ // determine whether _Ty is floating point
};
template<>
struct _Is_floating_point<double>
: true_type
{ // determine whether _Ty is floating point
};
template<>
struct _Is_floating_point<long double>
: true_type
{ // determine whether _Ty is floating point
};
// TEMPLATE CLASS is_floating_point
template<class _Ty>
struct is_floating_point
: _Is_floating_point<remove_cv_t<_Ty>>::type
{ // determine whether _Ty is floating point
};
template<class _Ty>
constexpr bool is_floating_point_v = is_floating_point<_Ty>::value;
// TEMPLATE CLASS is_arithmetic
template<class _Ty>
struct is_arithmetic
: bool_constant<is_integral<_Ty>::value
|| is_floating_point<_Ty>::value>
{ // determine whether _Ty is an arithmetic type
};
template<class _Ty>
constexpr bool is_arithmetic_v = is_arithmetic<_Ty>::value;
// TEMPLATE CLASS remove_reference
template<class _Ty>
struct remove_reference
{ // remove reference
using type = _Ty;
};
template<class _Ty>
struct remove_reference<_Ty&>
{ // remove reference
using type = _Ty;
};
template<class _Ty>
struct remove_reference<_Ty&&>
{ // remove rvalue reference
using type = _Ty;
};
template<class _Ty>
using remove_reference_t = typename remove_reference<_Ty>::type;
_STD_END
#pragma pop_macro("new")
#pragma warning(pop)
#pragma pack(pop)
#endif /* RC_INVOKED */
#endif /* _XTR1COMMON_ */
/*
* Copyright (c) by P.J. Plauger. All rights reserved.
* Consult your license regarding permissions and restrictions.
V6.50:0009 */
对不起,我的意思是这些错误*位于单个文件xtr1common中。总共有52个。 –
问题不在于此代码中,而在于它包含的地方。你有没有'extern“C”{#include}'?由于C语言中没有模板,所以模板不能有C链接。 –
当我尝试在此处的intel示例页面中构建简单示例时,出现上述错误消息> https://software.intel.com/en-us/intel-opencl-support/code-samples。例如,我刚刚加载了来自Buffer的示例>用于Windows Image的高级OpenCL Samples。只要我建立它,相同的消息从之前出现......模板不能被声明为“c”链接。我查看了代码,没有看到您描述的任何内容。 :( –