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

wti*_*ong 5 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 */
Run Code Online (Sandbox Code Playgroud)

将被Xcode 9拒绝,并显示错误消息"Partial template specialization并不比主模板更专业".但是在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
};
Run Code Online (Sandbox Code Playgroud)

谢谢

Ada*_*m P 8

这给了我另一个错误信息.我找到了另一种解决方案:

我改变了TensorStorage.h中的第34行

template<typename T, typename Dimensions, int Options_> class TensorStorage;
Run Code Online (Sandbox Code Playgroud)

template<typename T, typename Dimensions, int Options_, typename empty = void> class TensorStorage;
Run Code Online (Sandbox Code Playgroud)


wti*_*ong 3

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

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
};
Run Code Online (Sandbox Code Playgroud)

到:

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
};
Run Code Online (Sandbox Code Playgroud)

代码现在很脏,但它可以工作。只需让第一个实现成为显式主模板即可。我会等待苹果的回复。