2

テンプレートにパラメーターとして渡される別のテンプレートの例を見つけました。

template<template<typename T> class AllocatePolicy>
struct Pool {
    void allocate(size_t n) {
        int *p = AllocatePolicy<int>::allocate(n);
    }
};


template<typename T> 
    struct allocator { static T * allocate(size_t n) { return 0; } };


int main()
{
    // pass the template "allocator" as argument. 

    Pool<allocator> test;



    return 0;
}

これは私には完全に理にかなっているように思えますが、MSVC2012 コンパイラは「アロケータ: あいまいなシンボル」と不平を言っています。

これはコンパイラの問題ですか、それともこのコードに何か問題がありますか?

4

1 に答える 1

2

あなたはおそらく悪を持っています:

using namespace std;

コードのどこかで、クラス テンプレートが標準アロケーターallocatorと衝突します。std::allocator

たとえば、次のコードは、using ディレクティブを含む行をコメントしない限りコンパイルされません。

#include <memory>

// Try commenting this!
using namespace std;

template<template<typename T> class AllocatePolicy>
struct Pool {
    void allocate(std::size_t n) {
        int *p = AllocatePolicy<int>::allocate(n);
    }
};

template<typename T>
struct allocator { static T * allocate(std::size_t n) { return 0; } };

int main()
{
    Pool<allocator> test;
}
于 2013-03-02T14:34:32.690 に答える