我发现了另一个作为参数传递给模板的模板的示例:

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编译器抱怨“分配器:歧义符号”

这是编译器问题还是此代码有问题?

最佳答案

您很可能有罪恶:

using namespace std;

在代码中的某个位置,这会使类模板allocatorstd::allocator Standard分配器发生冲突。

例如,除非您注释包含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;
}

关于c++ - 模板参数到模板-不明确的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15175613/

10-11 22:45