Xcode 9用于在c ++中构建部分模板特化

时间:2017-09-22 02:57:50

标签: c++ xcode clang

我将我的Xcode更新到版本9并开始构建包含Tensorflow框架的应用程序。看来代码如下:

#ifndef Header_h
#define Header_h
template<class T1, class T2, int I> class A {}; // primary template

template<class T1, int I, class T2> class A<T1, T2, I> {};  //error
#endif /* Header_h */

将被Xcode 9拒绝,并显示错误消息&#34;部分模板专业化并不比主要模板更专业化#34;。但是在Xcode 8.3.3和visual studio中,它很不错。

这是原始的Tensorflow代码:(TensorStorage.h)

template<typename T, typename Dimensions, int Options_> class TensorStorage;


// Pure fixed-size storage
template<typename T, int Options_, typename FixedDimensions>
class TensorStorage<T, FixedDimensions, Options_>
{
    //implementation
};

// pure dynamic
template<typename T, int Options_, typename IndexType, int NumIndices_>
class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_>
{
    //implementation
};

由于

3 个答案:

答案 0 :(得分:8)

这给了我另一条错误消息。我找到了另一种解决方案:

我从

更改了TensorStorage.h中的第34行
template<typename T, typename Dimensions, int Options_> class TensorStorage;

template<typename T, typename Dimensions, int Options_, typename empty = void> class TensorStorage;

答案 1 :(得分:3)

我现在来回答我自己的问题。我想这可能是编译器的问题。我已经向Apple发送了技术支持事件,但目前我发现了一些肮脏的解决方案。更改原始代码:

template<typename T, typename Dimensions, int Options_> class TensorStorage;
// Pure fixed-size storage
template<typename T, int Options_, typename FixedDimensions>
class TensorStorage<T, FixedDimensions, Options_>
{
    //implementation
};

// pure dynamic
template<typename T, int Options_, typename IndexType, int NumIndices_>
class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_>
{
    //implementation
};

要:

template<typename T, typename FixedDimensions, int Options_> //class TensorStorage;
// Pure fixed-size storage
//template<typename T, int Options_, typename FixedDimensions>
class TensorStorage//<T, FixedDimensions, Options_>
{
    //implementation
};

// pure dynamic
template<typename T, int Options_, typename IndexType, int NumIndices_>
class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_>
{
    //implementation
};

现在代码很脏,但它有效。只需让第一个实现成为显式主模板。我等着苹果的回复。

答案 2 :(得分:2)

你的编译器是抱怨的权利。这是Eigen的一个错误。

标题: eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h

模板声明

<强> TensorStorage.h:34

template<typename T, typename FixedDimensions, int Options_> class TensorStorage;

虽然,定义并未对上述声明进行进一步的专门化,

<强> TensorStorage.h:38,39

template<typename T, int Options_, typename FixedDimensions>
class TensorStorage<T, FixedDimensions, Options_>
{

修复很明显,

<强> TensorStorage.h:38,39

旧:

- template<typename T, int Options_, typename FixedDimensions>
- class TensorStorage<T, FixedDimensions, Options_>
  {

新:

+ template<typename T, typename FixedDimensions, int Options_>      // swap the templ params to match the declaration
+ class TensorStorage                                               // drop the specialization (because it didn't!)
  {